; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; 1:57 pm 27/3/84 Dark Star (?) ; 3:39 pm 29/3/84 Began towers ; 9:26 pm 6/4/84 Finished Towers ; ; Spectrum version ; ; I've grafted the FP front end on to ; provide user defined keys. ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Assemble this with the zeus.exe assembler ; from www.desdes.com ; ; This command tells Zeus where to put the code it generates ; change the filename to suit yourself zeusemulate "48K" ; output_szx "ds1.szx",$0000,Start ; The szx file ; Spectrum equates ScreenBase equ $4000 ; Attrs equ $5800 ; lAttrs equ $300 ; ; Front end source starts nOptions equ 3 ; MessWait equ 4000 ; ; General equates CodeFlashRate equ 100 ; ArrowPos1 equ $4004 ; ArrowPos2 equ $50BF ; GameRunning equ 0 ; GameFinished equ 1 ; GameQuit equ 2 ; ModeDemo equ 1 ; ; Vectors to other parts of the code. This isn't included in this source (yet)... SpaceInvaders equ $DA00 ; ; Start of Spectrum free memory org $5B00 ; ; Include the fixed data and the start vector ; These are some fixed data fields generated by other tools... ; Character set graphics pChars defb $00,$00,$00,$00,$00,$00,$00,$00; defb $80,$80,$80,$80,$80,$00,$80,$00; defb $A0,$A0,$A0,$00,$00,$00,$00,$00; defb $50,$50,$F8,$50,$F8,$50,$50,$00; defb $20,$78,$A0,$70,$28,$F0,$20,$00; defb $C0,$C8,$10,$20,$40,$98,$18,$00; defb $40,$A0,$A0,$40,$A8,$90,$68,$00; defb $80,$80,$80,$00,$00,$00,$00,$00; defb $20,$40,$80,$80,$80,$40,$20,$00; defb $80,$40,$20,$20,$20,$40,$80,$00; defb $20,$A8,$70,$20,$70,$A8,$20,$00; defb $00,$20,$20,$F8,$20,$20,$00,$00; defb $00,$00,$00,$00,$40,$40,$80,$00; defb $00,$00,$00,$F8,$00,$00,$00,$00; defb $00,$00,$00,$00,$00,$00,$80,$00; defb $00,$08,$10,$20,$40,$80,$00,$00; defb $70,$88,$98,$A8,$C8,$88,$70,$00; defb $20,$60,$20,$20,$20,$20,$70,$00; defb $70,$88,$08,$30,$40,$80,$F8,$00; defb $F8,$08,$10,$30,$08,$88,$70,$00; defb $10,$30,$50,$90,$F8,$10,$10,$00; defb $F8,$80,$F0,$08,$08,$88,$70,$00; defb $38,$40,$80,$F0,$88,$88,$70,$00; defb $F8,$08,$10,$20,$40,$40,$40,$00; defb $70,$88,$88,$70,$88,$88,$70,$00; defb $70,$88,$88,$78,$08,$10,$E0,$00; defb $00,$00,$80,$00,$80,$00,$00,$00; defb $00,$00,$40,$00,$40,$40,$80,$00; defb $10,$20,$40,$80,$40,$20,$10,$00; defb $00,$00,$F8,$00,$F8,$00,$00,$00; defb $80,$40,$20,$10,$20,$40,$80,$00; defb $70,$88,$10,$20,$20,$00,$20,$00; defb $70,$88,$A8,$B8,$B0,$80,$78,$00; defb $20,$50,$88,$88,$F8,$88,$88,$00; defb $F0,$88,$88,$F0,$88,$88,$F0,$00; defb $70,$88,$80,$80,$80,$88,$70,$00; defb $F0,$88,$88,$88,$88,$88,$F0,$00; defb $F8,$80,$80,$F0,$80,$80,$F8,$00; defb $F8,$80,$80,$F0,$80,$80,$80,$00; defb $78,$80,$80,$80,$98,$88,$78,$00; defb $88,$88,$88,$F8,$88,$88,$88,$00; defb $E0,$40,$40,$40,$40,$40,$E0,$00; defb $08,$08,$08,$08,$08,$88,$70,$00; defb $88,$90,$A0,$C0,$A0,$90,$88,$00; defb $80,$80,$80,$80,$80,$80,$F8,$00; defb $88,$D8,$A8,$A8,$88,$88,$88,$00; defb $88,$88,$C8,$A8,$98,$88,$88,$00; defb $70,$88,$88,$88,$88,$88,$70,$00; defb $F0,$88,$88,$F0,$80,$80,$80,$00; defb $70,$88,$88,$88,$A8,$90,$68,$00; defb $F0,$88,$88,$F0,$A0,$90,$88,$00; defb $70,$88,$80,$70,$08,$88,$70,$00; defb $F8,$20,$20,$20,$20,$20,$20,$00; defb $88,$88,$88,$88,$88,$88,$70,$00; defb $88,$88,$88,$88,$88,$50,$20,$00; defb $88,$88,$88,$A8,$A8,$D8,$88,$00; defb $88,$88,$50,$20,$50,$88,$88,$00; defb $88,$88,$50,$20,$20,$20,$20,$00; defb $F8,$08,$10,$20,$40,$80,$F8,$00; defb $F8,$C0,$C0,$C0,$C0,$C0,$F8,$00; defb $00,$80,$40,$20,$10,$08,$00,$00; defb $F8,$18,$18,$18,$18,$18,$F8,$00; defb $20,$70,$A8,$20,$20,$20,$00,$00; defb $00,$00,$00,$00,$00,$00,$F8,$00; defb $00,$00,$00,$00,$00,$00,$00,$00; defb $00,$00,$68,$98,$88,$98,$68,$00; defb $80,$80,$B0,$C8,$88,$C8,$B0,$00; defb $00,$00,$78,$80,$80,$80,$78,$00; defb $08,$08,$68,$98,$88,$98,$68,$00; defb $00,$00,$70,$88,$F8,$80,$70,$00; defb $20,$40,$40,$E0,$40,$40,$40,$00; defb $00,$00,$78,$88,$98,$68,$08,$70; defb $80,$80,$F0,$88,$88,$88,$88,$00; defb $80,$00,$80,$80,$80,$80,$80,$00; defb $00,$20,$00,$20,$20,$20,$20,$C0; defb $80,$80,$90,$A0,$E0,$90,$88,$00; defb $C0,$40,$40,$40,$40,$40,$E0,$00; defb $00,$00,$D0,$A8,$A8,$A8,$A8,$00; defb $00,$00,$F0,$88,$88,$88,$88,$00; defb $00,$00,$70,$88,$88,$88,$70,$00; defb $00,$00,$F0,$88,$88,$F0,$80,$80; defb $00,$00,$78,$88,$88,$78,$08,$08; defb $00,$00,$B0,$C0,$80,$80,$80,$00; defb $00,$00,$78,$80,$70,$08,$F0,$00; defb $00,$20,$F8,$20,$20,$20,$18,$00; defb $00,$00,$88,$88,$88,$88,$78,$00; defb $00,$00,$88,$88,$50,$50,$20,$00; defb $00,$00,$88,$88,$88,$A8,$50,$00; defb $00,$00,$88,$50,$20,$50,$88,$00; defb $00,$00,$90,$90,$90,$F0,$10,$E0; defb $00,$00,$F8,$10,$20,$40,$F8,$00; defb $30,$40,$40,$80,$40,$40,$30,$00; defb $00,$80,$80,$00,$00,$80,$80,$00; defb $C0,$20,$20,$10,$20,$20,$C0,$00; defb $50,$00,$70,$88,$F8,$80,$70,$00; defb $00,$00,$08,$70,$80,$00,$00,$00; ; Character widths wChars defb $07,$09,$09,$09,$09,$09,$09,$03; defb $05,$05,$05,$05,$03,$05,$05,$05; defb $05,$03,$05,$05,$05,$05,$09,$09 ; " " .. defb $07,$09,$07,$02,$05,$09,$07,$09; defb $06,$02,$04,$06,$06,$06,$06,$02; defb $04,$04,$06,$06,$03,$06,$02,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$02,$03,$05,$06,$05,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$04,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$04,$06; defb $06,$02,$04,$06,$04,$06,$06,$06; defb $06,$06,$05,$06,$06,$06,$06,$06; defb $06,$05,$06,$05,$02,$05,$06,$06; defb $03,$06,$0C,$12,$18,$1E,$24,$2A ; Wide spaces $80..? defb $30,$36,$3C,$42,$48,$06,$06,$06; defb $01,$02,$03,$04,$05,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; defb $06,$06,$06,$06,$06,$06,$06,$06; ; The user-defined key codes UDKTab defb $01,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $02,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $26,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $25,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $0A,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $05,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $06,$07,$08,$09,$22,$21,$20,$1F; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; ; Initial settings for the user-defined keys iUDKTab defb $01,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $02,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $26,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $25,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $0A,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $05,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $06,$07,$08,$09,$22,$21,$20,$1F; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF; ; Point to the four different HighScore tables... Only two really. HighPtrs defw HighScores,HighScores1,HighScores,HighScores1 ; ; Now have the initial highscore tables. HighScores defb "I see children with vacant stares",$00,$01,$00; defb "I thought I heard them say . . . ",$00,$01,$00; defb "Don't think sorry's easily said",$00,$01,$00; defb " ",$00,$01,$00 ; defb "The price of infamy , the edge of insanity",$00,$01,$00; defb "Talking 'bout stupid things",$00,$01,$00; defb "She is dancing away from you now",$00,$01,$00; defb "Take me for a fool if you feel that's right",$00,$01,$00; defb "Or a whipping boy , someone to despise",$00,$01,$00; defb "Please don't look at me this way",$00,$01,$00; defb " ",$00,$01,$00 ; defb "It's coming for me thro' the trees",$00,$01,$00; defb "And you may ask yourself",$00,$01,$00; defb "Wonder why . . What makes me rise so high",$00,$01,$00; defb "Surely you know-the chance has gone by",$00,$01,$00; defb "And my spirit is crying for leaving",$00,$01,$00; HighScores1 defb "We're not scared to lose it all",$00,$01,$00; defb "Security gone to the wall",$00,$01,$00; defb "Future dreams we have to realise",$00,$01,$00; defb "A thousand critics hands",$00,$01,$00; defb "Won't keep us from the things we plan",$00,$01,$00; defb "While we cling to the Things we prize",$00,$01,$00; defb "And do you feel scared - I do",$00,$01,$00; defb "But I won't stop and falter",$00,$01,$00; defb "And if we threw it all away",$00,$01,$00; defb "Things can only get better",$00,$01,$00; defb "Treating this as though it was",$00,$01,$00; defb "The last , the final game",$00,$01,$00; defb "Get to christmas and feel no regret",$00,$01,$00; defb "It may take a little time",$00,$01,$00; defb "A lonely path , an uphill climb",$00,$01,$00; defb "Success or failure cannot alter us",$00,$01,$00; defb "Please excuse me , i have some aging & dying to "; defb "be getting on with ." ; ; Fill the rest of the highscore table buffer with zeros defs (HighScores+$600) - $,$00 ; ; The highscore editing line HSBuffer defs $80,$00 ; ; mem_var UDKTab,* - UDKTab ; This block is writable ; Encrypted end message... Message defb $F4,$F4,$F4,$ED,$33,$4F,$48,$52; defb $07,$4A,$4C,$58,$07,$48,$52,$07; defb $42,$56,$51,$51,$4C,$42,$53,$07; defb $00,$07,$33,$4F,$4C,$07,$54,$4C; defb $52,$52,$40,$4E,$4C,$07,$51,$4C; defb $40,$43,$52,$07,$19,$14,$F4,$F4; defb $F4,$EC,$01,$07,$15,$07,$15,$07; defb $15,$07,$54,$55,$07,$53,$40,$57; defb $4C,$07,$51,$4C,$42,$56,$51,$43; defb $4C,$51,$07,$00,$07,$20,$4F,$07; defb $00,$07,$20,$53,$07,$4B,$40,$52; defb $53,$07,$00,$F4,$31,$48,$4E,$4F; defb $53,$07,$0B,$07,$28,$0E,$5D,$4C; defb $07,$56,$55,$4B,$58,$07,$4E,$56; defb $53,$07,$40,$07,$4D,$4C,$5E,$07; defb $52,$4C,$42,$56,$55,$43,$52,$07; defb $0B,$07,$4D,$48,$51,$52,$53,$F4; defb $28,$0E,$43,$07,$4B,$48,$4A,$4C; defb $07,$53,$56,$07,$52,$40,$58,$07; defb $4F,$56,$5E,$07,$4B,$48,$53,$53; defb $4B,$4C,$07,$28,$0E,$5D,$4C,$07; defb $4C,$55,$49,$56,$58,$4C,$43,$F4; defb $41,$5C,$48,$4B,$43,$48,$55,$4E; defb $07,$53,$4F,$48,$52,$07,$53,$4C; defb $43,$48,$56,$5C,$52,$07,$57,$4B; defb $40,$55,$4C,$53,$07,$0B,$07,$52; defb $4C,$42,$56,$55,$43,$4B,$58,$F4; defb $28,$0E,$43,$07,$49,$5C,$52,$53; defb $07,$4B,$48,$4A,$4C,$07,$53,$56; defb $07,$57,$56,$5C,$51,$07,$42,$56; defb $55,$53,$4C,$54,$57,$53,$07,$56; defb $55,$07,$15,$07,$15,$07,$15,$07; defb $01,$F4,$F4,$ED,$21,$5C,$53,$07; defb $40,$53,$07,$53,$4F,$48,$52,$07; defb $57,$56,$48,$55,$53,$07,$53,$4F; defb $4C,$07,$53,$40,$57,$4C,$07,$51; defb $5C,$55,$52,$07,$56,$5C,$53,$07; defb $40,$55,$43,$07,$53,$4F,$4C,$F4; defb $51,$4C,$52,$53,$07,$56,$4D,$07; defb $53,$4F,$4C,$07,$54,$4C,$52,$52; defb $40,$4E,$4C,$07,$48,$52,$07,$4B; defb $56,$52,$53,$07,$53,$56,$07,$53; defb $4F,$4C,$07,$52,$4C,$40,$52,$F4; defb $56,$4D,$07,$53,$48,$54,$4C,$07; defb $15,$F4,$F4,$E2,$01,$30,$5C,$48; defb $53,$4C,$07,$40,$07,$57,$56,$4C; defb $53,$48,$42,$07,$4C,$55,$43,$48; defb $55,$4E,$07,$28,$07,$53,$4F,$56; defb $5C,$4E,$4F,$53,$01,$F4,$E3,$01; defb $32,$4F,$5C,$53,$07,$5C,$57,$07; defb $40,$55,$43,$07,$43,$56,$07,$53; defb $4F,$4C,$07,$4B,$56,$40,$43,$4C; defb $51,$01,$E7,$AA,$AA,$AA,$E6,$9F; defb $C3,$CD,$70,$C3,$00,$94,$C3,$9E; defb $7A,$C3,$A6,$7A,$C3,$AE,$7A,$C3; defb $B6,$7A,$C3,$BE,$7A,$C3,$C6,$7A; defb $C3,$CE,$7A,$C3,$D6,$7A,$E6,$9F; defb $F2,$3C,$F8,$3B,$C3,$6A,$6F,$C3; defb $8C,$77,$C3,$A3,$6D,$C3,$F6,$6E; defb $C3,$A3,$79,$00,$80,$40,$04,$00; defb $20,$01,$00,$00,$47,$47,$00,$00; defb $00,$C3,$0C,$7D,$F8,$3C,$66,$66; defb $3E,$06,$66,$3C,$00,$3C,$66,$66; defb $66,$66,$66,$3C,$00,$18,$38,$18; ; When decoded, that says: ; [yellow] This key is correct ! The message reads :- ; ; ; [Cyan] " . . . mn tape recorder ! Ah ! At last ! ; Right , I've only got a few seconds , first ; I'd like to say how little I've enjoyed ; building this tedious planet , secondly ; I'd just like to pour contempt on . . . " ; ; [yellow] But at this point the tape runs out and the ; rest of the message is lost to the seas ; of time . ; ; [magenta] "Quite a poetic ending I thought" ; [green] "Shut up and do the loader" ; Fill to the start of the code with zeros defs $6B00 - $,$00 ; ; This looks like the start address, but that's a piece of misdirection. ; If you start it here it will crash (top bit of R is not set)... Start jp Reset ; ; Vector to the actual game code Play jp GameCode ; ; Vectors to key scan code kLeft defs 3 ; kRight defs 3 ; kUp defs 3 ; kDown defs 3 ; kAccel defs 3 ; kDeccel defs 3 ; kFire defs 3 ; defs 9,$00 ; Spare room vReadKey jp ReadKeys ; vScanOptiKeys jp ScanOptiKeys ; vPrint jp Print ; vPrintStr jp PrintStr ; vAddScroll jp AddScroll ; pCurX defs 1 ; pCurY defs 2 ; ppCurY defs 1 ; AType defs 1 ; BType defs 1 ; CType defs 1 ; DType defs 1 ; EType defs 1 ; DDamage defs 1 ; ADamage defs 1 ; DScore defs 2 ; nCodesFound defs 1 ; vFuckUp jp FuckUp ; EndState defs 1 ; Mode defs 1 ; ; Character set for the soft-scrolling digits Zero defb $3C,$66,$66,$3E,$06,$66,$3C,0; Sc0 defb $3C,$66,$66,$66,$66,$66,$3C,0; Sc1 defb $18,$38,$18,$18,$18,$18,$7E,0; Sc2 defb $3C,$66,$06,$3C,$60,$66,$7E,0; Sc3 defb $3C,$66,$06,$1C,$06,$66,$3C,0; Sc4 defb $1C,$3C,$6C,$CC,$FE,$0C,$1E,0; Sc5 defb $7E,$62,$60,$7C,$06,$66,$3C,0; Sc6 defb $3C,$66,$60,$7C,$66,$66,$3C,0; Sc7 defb $7E,$66,$06,$0C,$18,$18,$18,0; Sc8 defb $3C,$66,$66,$3C,$66,$66,$3C,0; Sc9 defb $3C,$66,$66,$3E,$06,$66,$3C,0; ScS defb 0,0,0,0,0,0,0,0 ; defb $10,$30,$10,$10,$10,$10,$38,0; ScTab1 defw ScS,Sc1,Sc2,Sc3,Sc4 ; defw Sc5,Sc6,Sc7,Sc8,Sc9 ; ScTab2 defw Sc0,Sc1,Sc2,Sc3,Sc4 ; defw Sc5,Sc6,Sc7,Sc8,Sc9 ; ; Energy display dials nDials equ 8 ; MaxEnergy equ nDials*9-1 ; ; These are the Krell meter style graphics Dial0 defb $07,$E0,$18,$18,$20,$04,$40,$02; defb $40,$02,$80,$01,$80,$01,$81,$81; defb $81,$81,$82,$41,$82,$41,$44,$22; defb $44,$22,$24,$24,$18,$18,$00,$00; Dial1 defb $07,$E0,$18,$18,$20,$04,$40,$02; defb $40,$02,$80,$01,$80,$01,$81,$81; defb $83,$81,$86,$41,$8E,$41,$5C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial2 defb $07,$E0,$18,$18,$20,$04,$40,$02; defb $40,$02,$80,$01,$80,$01,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial3 defb $07,$E0,$18,$18,$30,$04,$78,$02; defb $7C,$02,$FE,$01,$FF,$01,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial4 defb $07,$E0,$1F,$18,$3F,$04,$7F,$02; defb $7F,$02,$FF,$01,$FF,$01,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial5 defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$F2; defb $7F,$E2,$FF,$C1,$FF,$81,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial6 defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$FE; defb $7F,$FE,$FF,$FF,$FF,$FF,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial7 defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$FE; defb $7F,$FE,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FE,$5F,$FE,$47,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial8 defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$FE; defb $7F,$FE,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FE,$7F,$FE,$7F,$7C,$3E; defb $7C,$3E,$3C,$3C,$18,$18,$00,$00; pUDKTab defs 2 ; pKeyTab defs 2 ; pKeyVDU defs 2 ; CurType defs 1 ; FlashpDisp defs 2 ; UDKat0 defs 1 ; UDKat1 defs 1 ; LineBuffer defs 30 ; OptiFlashR equ 400 ; JoyFlashRate equ 400 ; CurFlag defs 1 ; CurrKey defs 1 ; CurrKeyAddr defs 2 ; RepDel defs 2 ; RepSpeed1 defs 2 ; RepSpeed2 defs 2 ; CursorSpeed defs 1 ; CursorType defs 1 ; CurCol defs 1 ; CapsShift equ KeyCounts ; KeyCounts defs 36 ; SymbolShift defs 4 ; MinScans equ 9 ; FlashRate equ 130 ; HSTimeOut equ $5400 ; pUDKd defs 1 ; UDKfr equ 400 ; UDKft defs 1 ; UDKatt defs 2 ; pList defs 2 ; EntryF defs 1 ; EntryY defs 2 ; pInsert defs 2 ; pHSEnd defs 2 ; KeyMask defs 40 ; cJoy defb 0 ; cJoyAttr defs 2 ; cInput defb "K" ; lKey equ 10 ; cDel equ $08 ; cCret equ $0D ; cCls equ $0C ; Clr equ $1B ; cHome equ $0E ; cBlack equ $00 ; cBlue equ $01 ; cRed equ $02 ; cMagenta equ $03 ; cGreen equ $04 ; cCyan equ $05 ; cYellow equ $06 ; cWhite equ $07 ; Colon1R equ $5AC2 ; Colon2R equ $5AC5 ; Colon1N equ $580E ; Colon2N equ $5811 ; ClockDataR defw ScS,ScS,ScS,ScS,ScS,ScS ; defw $50C7,$50C6,$50C4,$50C3,$50C1,$50C0; defb 9,5,9,5,9,9 ; ClockDataN defw ScS,ScS,ScS,ScS,ScS,ScS ; defw $4013,$4012,$4010,$400F,$400D,$400C; defb 9,5,9,5,9,9 ; CDEnd equ $ ; SecCount defb 1 ; Slice defb 1 ; nScroll defb 1 ; p1 defs 12 ; FirstpDig defs 12 ; FirstDig defs 6 ; ScCnt defb 0 ; Sc_F defb 0 ; ScPtr defw 0 ; ScAttr defb $45 ; ScACnt defb 0 ; Buff0 defb 0 ; Buff1 defb 0 ; Buff2 defb 0 ; Buff3 defb 0 ; Buff4 defb 0 ; Buff5 defb 0 ; Buff6 defb 0 ; Buff7 defb 0 ; pcDial defs 2 ; pcShape defs 2 ; UDKWS defs 7*64,0 ; pScrBuf1 dw 0 ; pScrBuf2 dw 0 ; ScrollBuff defs 30 ; ScoreData defw ScS,ScS,ScS,ScS,Sc0 ; Initial data. Copied down defw 0 ; defb 9,0,1 ; ; The initial data above is copied to these vars to init them ScorePtrs defs 5*2 ; AScore defs 2 ; ScScrCnt defs 1 ; ScScrDir defs 1 ; ScScrNo defs 1 ; ; mem_var kLeft,* - kLeft ; This block is writable Print push ix ; push hl ; push de ; push bc ; push af ; cp cWhite+1 ; jr c,pColour ; cp cCls ; jr z,pCls ; cp cCret ; jr z,pCR ; cp cHome ; jr z,pHome ; ld h,wChars/256 ; ld l,a ; ld a,(pCurX) ; add a,(hl) ; call c,pCret ; call pOutChar ; ld a,(pCurX) ; add a,(hl) ; ld (pCurX),a ; pExit pop af ; pop bc ; pop de ; pop hl ; pop ix ; ret ; pColour cp 4 ; jr nc,pCol1 ; or $40 ; pCol1 ld (CurCol),a ; jr pExit ; pCR call pCret ; jr pExit ; pCls ld e,$00 ; ld hl,Attrs ; ld bc,$0300 ; pC1 ld a,(hl) ; and $07 ; jr z,pC2 ; set 0,e ; dec (hl) ; pC2 cpi ; jp pe,pC1 ; call Delay ; bit 0,e ; jr nz,pCls ; ld hl,ScreenBase ; ld de,ScreenBase+1 ; ld bc,$1800 ; xor a ; ld (hl),a ; ldir ; ld a,(CurCol) ; ld (hl),a ; ld bc,$02FF ; ldir ; xor a ; out ($FE),a ; pHome xor a ; ld (pCurX),a ; ld (ppCurY),a ; ld a,cWhite ; ld (CurCol),a ; ld hl,ScreenBase ; ld (pCurY),hl ; jr pExit ; pCret ld a,(ppCurY) ; inc a ; SetUpY ld (ppCurY),a ; and $1F ; push hl ; ld l,a ; ld h,$00 ; add hl,hl ; ld de,YTableFE ; add hl,de ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; ld (pCurY),hl ; xor a ; ld (pCurX),a ; pop hl ; ret ; pOutChar bit 7,l ; ret nz ; push hl ; ld h,0 ; add hl,hl ; add hl,hl ; add hl,hl ; ld de,pChars-256 ; add hl,de ; push hl ; pop ix ; ld a,(pCurX) ; rrca ; rrca ; rrca ; and $1F ; ld de,(pCurY) ; or e ; ld e,a ; push de ; ld a,d ; rrca ; rrca ; rrca ; and $03 ; or $58 ; ld d,a ; ld a,(CurCol) ; ld (de),a ; inc de ; ld (de),a ; pop de ; ld a,(pCurX) ; and $07 ; ld c,a ; ld b,$08 ; OutCharL ld h,(ix) ; ld l,$00 ; ld a,c ; or a ; jr z,OCL1 ; OCL2 srl h ; rr l ; dec a ; jr nz,OCL2 ; OCL1 ld a,(de) ; xor h ; ld (de),a ; inc e ; ld a,(de) ; xor l ; ld (de),a ; dec e ; inc ix ; inc d ; djnz OutCharL ; pop hl ; ret ; YTableFE defw $4000,$4020,$4040,$4060 ; defw $4080,$40A0,$40C0,$40E0 ; defw $4800,$4820,$4840,$4860 ; defw $4880,$48A0,$48C0,$48E0 ; defw $5000,$5020,$5040,$5060 ; defw $5080,$50A0,$50C0,$50E0 ; defw 0,0,0,0,0,0,0,0 ; Wait ld a,$7F ; in a,($FE) ; rra ; jr nc,Wait ; ret ; Delay push bc ; ld bc,$0320 ; Del1 cpi ; dec hl ; jp pe,Del1 ; pop bc ; ret ; PrintStr push hl ; push af ; PStr1 ld a,(hl) ; inc hl ; or a ; jr z,PStr2 ; call Print ; jr PStr1 ; PStr2 pop af ; pop hl ; ret ; PrintStr1 ex (sp),hl ; push af ; PStr11 ld a,(hl) ; inc hl ; or a ; jr z,PStr12 ; call Print ; jr PStr11 ; PStr12 pop af ; ex (sp),hl ; ret ; InitKbd ld hl,KeyCounts ; ld de,KeyCounts+1 ; ld bc,$0027 ; ld (hl),$49 ; ldir ; xor a ; ld (CurrKey),a ; ld hl,200 ; ld (RepSpeed1),hl ; ld hl,30 ; ld (RepSpeed2),hl ; ret ; ReadKey push ix ; push hl ; push de ; push bc ; push af ; ex af,af' ;;;; push af ; ld hl,CapsShift ; set 7,(hl) ; ld hl,SymbolShift ; set 7,(hl) ; call ReadKeys ; dec a ; ld b,a ; xor a ; ld hl,CapsShift ; bit 6,(hl) ; jr z,Shifta ; add a,40 ; Shifta ld hl,SymbolShift ; bit 6,(hl) ; jr z,Shiftb ; add a,80 ; Shiftb add a,b ; ld e,a ; ld d,0 ; ld hl,kTab0 ; add hl,de ; pop af ; ex af,af' ;;;; pop af ; ld a,(hl) ; pop bc ; pop de ; pop hl ; pop ix ; ret ; ReadKeys ld a,1 ; ld (CursorSpeed),a ; ld (CursorType),a ; ReadKeyLp call CursorInv ; call ScanKeys ; jr nz,RKNewKey ; ld a,(CurrKey) ; or a ; jr z,ReadKeyLp ; ld hl,(CurrKeyAddr) ; bit 6,(hl) ; jr z,RKCancelOld ; ld hl,(RepDel) ; dec hl ; ld (RepDel),hl ; ld a,l ; or h ; jr nz,ReadKeyLp ; ld hl,(RepSpeed2) ; RK1 ld (RepDel),hl ; call CursorOff ; ld a,(CurrKey) ; ret ; RKNewKey ld (CurrKey),a ; ld hl,(RepSpeed1) ; ld (CurrKeyAddr),ix ; jr RK1 ; RKCancelOld xor a ; ld (CurrKey),a ; jr ReadKeyLp ; CursorOff ld a,(CursorType) ; or a ; jr z,FlipCur ; ret ; CursorInv ld a,(CursorSpeed) ; dec a ; ld (CursorSpeed),a ; ret nz ; ld a,FlashRate ; ld (CursorSpeed),a ; ld a,(CursorType) ; xor $01 ; ld (CursorType),a ; FlipCur ld l,$5F ; jp pOutChar ; ScanKeys ld bc,$FFFE ; ld hl,KeyCounts ; ld e,0 ; ScanKeyLp dec b ; in a,(c) ; ld d,5 ; ScanKeyLp2 rra ; call nc,SKPressed ; call c,SKNotPressed ; inc hl ; dec d ; jr nz,ScanKeyLp2 ; scf ; rl b ; inc b ; jr nz,ScanKeyLp ; ld a,e ; or a ; ret ; SKPressed ex af,af' ;;;; ld a,(hl) ; and $3F ; cp MinScans ; jr z,SKP1 ; inc (hl) ; ex af,af' ;;;; ret ; SKP1 bit 6,(hl) ; jr nz,SKexit ; bit 7,(hl) ; jr nz,SKexit1 ; ld a,e ; or a ; jr nz,SKexit ; push hl ; pop ix ; call CalcKeyPos ; ld e,a ; SKexit1 set 6,(hl) ; SKexit ex af,af' ;;;; ret ; SKNotPressed ex af,af' ;;;; ld a,(hl) ; and $3F ; jr z,SKNP1 ; dec (hl) ; ex af,af' ;;;; ret ; SKNP1 res 6,(hl) ; ex af,af' ;;;; ret ; CalcKeyPos push de ; ld de,KeyCounts-1 ; or a ; sbc hl,de ; ld a,l ; add hl,de ; pop de ; ret ; ; Keyboard map kTab0 defb " zxcv" ; defb "asdfg" ; defb "qwert" ; defb "12345" ; defb "09876" ; defb "poiuy" ; defb cCret,"lkjh" ; defb " mnb" ; defb " ZXCV" ; defb "ASDFG" ; defb "QWERT" ; defb "!@#$%" ; defb cDel,")('&" ; defb "POIUY" ; defb cCret,"LKJH" ; defb " MNB" ; defb " :#?/" ; defb "~|'{}" ; defb " <>" ; defb "!@#$%" ; defb "_)('&" ; defb $22,$3B," ][" ; Changed from $22,"; ][" because zxspin defb cCret,"=+-^" ; can't cope with ; appearing in a string. defb " .,*" ; It thinks it's a comment! Wonderful.not ; Note that the hidden message in the keys was corrupted defb " " ; defb "t I g" ; This should present a message if you hit the defb "a gir" ; extended-shift keys in order... defb cBlue,cRed,cMagenta,cGreen,cCyan ; defb Clr,cCls,cCret,cWhite,cYellow; defb "sel l" ; defb "dam o" ; defb " " ; ; Front end code starts here Reset di ; ld a,r ; Randomly choose a table and $06 ; (if the loader doesn't screw R) add a,HighPtrs & $FF ; ld l,a ; ld h, HighPtrs / 256 ; ld a,(hl) ; Read the address inc hl ; ld h,(hl) ; ld l,a ; ld de,HighScores ; And move it to the start ld bc,$0300 ; ldir ; Boot ld sp,$0000 ; Set the stack ld hl,iUDKTab ; Set the user defined keys ld de,UDKTab ; ld bc,$0080 ; ldir ; call InitKbd ; Setup the keys call InitOpti ; And the options DispMain di ; Start the front end ld hl,sMainMenu ; Show the menu call PrintStr ; ld hl,HSTimeOut ; Pause before show highscores MainLoop ld bc,$7C10 ; call ScanOptiKeys ; ld de,MainVecTab ; jp c,VecGoto ; dec hl ; Loop ld a,h ; or l ; jr nz,MainLoop ; ; Show the highscore table DispHS ld hl,0 ; ld (DScore),hl ; DispHS1 xor a ; ld (EntryF),a ; ld hl,sHighA ; call PrintStr ; ld ix,HighScores ; ld a,"1" ; DHSlp call PrintHS ; inc a ; cp "9"+1 ; jr nz,DHS1 ; add a,"A"-("9"+1) ; DHS1 cp "H" ; jr nz,DHSlp ; ld a,(EntryF) ; or a ; jp nz,AcceptEnt ; ld hl,sHighB ; call PrintStr ; HSw ld bc,$0030 ; call ScanOptiKeys ; jr nc,HSw ; cp 10 ; jp z,DispMain ; jp DispGame ; DispCont ld a,(cInput) ; cp "J" ; jp z,DispJoy ; DispKeys ld a,"K" ; ld (cInput),a ; ld hl,sKeysMenu ; call PrintStr ; ld hl,UDKTab ; ld iy,YTableFE+4 ; ld b,$07 ; UDKa push bc ; ld c,(iy) ; ld b,(iy+1) ; ld (pCurY),bc ; ld a,100 ; ld (pCurX),a ; call UDKlist ; ld bc,4 ; add iy,bc ; ld a,l ; or $0F ; ld l,a ; inc hl ; pop bc ; djnz UDKa ; UDKw call UDKwa1 ; UDKw1 ld bc,$7FF0 ; call ScanOptiKeys ; jr nc,UDKw1 ; cp 9 ; jp z,DispJoy ; cp 8 ; jp nc,DispMain ; push af ; add a,a ; add a,a ; ld l,a ; ld h,0 ; ld de,YTableFE ; add hl,de ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; ld (pCurY),hl ; pop af ; dec a ; ld l,a ; ld h,$00 ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; ld bc,Attrs+64+2 ; add hl,bc ; add a,a ; add a,a ; add a,a ; add a,a ; ld e,a ; ld d,0 ; inc hl ; ld a,(hl) ; ld (UDKat0),a ; dec hl ; xor $40 ; ld (UDKat1),a ; ld (pKeyVDU),hl ; ld hl,UDKTab ; add hl,de ; ld (pKeyTab),hl ; ld a,100 ; ld (pCurX),a ; ld iy,(pCurY) ; ld hl,(pKeyTab) ; call UDKlist ; ld (pCurY),iy ; ld a,100 ; ld (pCurX),a ; ld hl,(pKeyTab) ; ld b,$10 ; UDKc1 ld (hl),$FF ; inc hl ; djnz UDKc1 ; call UDKwa1 ; call SetUpKeyMap ; ld ix,(pKeyTab) ; xor a ; ld (CurType),a ; ld hl,1 ; UDKlp call FlashLine ; call UDKscan ; jr z,UDKlp ; cp 16 ; "1" jr z,UDKend ; dec a ; ld b,a ; ld a,ixl ; cpl ; and $0F ; jr z,UDKlp ; ld a,cMagenta ; call Print ; ld a,b ; ld (ix),a ; inc ix ; call UDKchar ; call PrintSp2 ; jr UDKlp ; UDKwa1 ld e,30 ; ld b,$7F ; UDKwait ld c,$FE ; in a,(c) ; or $E0 ; inc a ; jr nz,UDKwa1 ; rrc b ; jr c,UDKwait ; dec e ; jr nz,UDKwait ; ret ; UDKend ld a,(UDKat0) ; call FLO ; push ix ; pop hl ; ld de,(pKeyTab) ; or a ; sbc hl,de ; jp nz,UDKw ; ld l,e ; ld h,d ; ld bc,iUDKTab-UDKTab ; add hl,bc ; ld bc,16 ; ldir ; ld hl,(pKeyTab) ; call UDKlist ; jp UDKw ; UDKscan ld iy,KeyCounts ; ld e,1 ; ld c,$FE ; ld b,$FE ; UDKsc1 ld d,$01 ; UDKsc2 in a,(c) ; and d ; jr nz,UDKsc3 ; bit 6,(iy) ; jr z,UDKsc3 ; res 6,(iy) ; ld a,e ; ret ; UDKsc3 inc iy ; inc e ; rlc d ; ld a,d ; cp $20 ; jr nz,UDKsc2 ; rlc b ; jr c,UDKsc1 ; xor a ; ret ; UDKlist ld a,(hl) ; bit 7,(hl) ; ret nz ; ld a,cMagenta ; call Print ; ld a,(hl) ; call UDKchar ; call PrintSp2 ; ld a,l ; cpl ; and $0F ; ret z ; inc hl ; jr UDKlist ; ; Show a UDK character name. Some are more than one char long... UDKchar push hl ; ld hl,UDKdesc ; inc a ; UDKp dec a ; jr z,UDKp1 ; UDKp2 bit 7,(hl) ; inc hl ; jr nz,UDKp2 ; jr UDKp ; UDKp1 ld a,(hl) ; and $7F ; call Print ; bit 7,(hl) ; inc hl ; jr nz,UDKp1 ; pop hl ; ret ; SetUpKeyMap ld hl,KeyCounts ; ld b,40 ; SUKM set 6,(hl) ; inc hl ; djnz SUKM ; ret ; DispJoy ld a,"J" ; ld (cInput),a ; ld hl,sJoysticks ; call PrintStr ; ld a,(cJoy) ; NewJoy call CalcpJoyAttr ; ld (cJoyAttr),hl ; call GrabLine ; ld d,0 ; ld hl,1 ; DJlp dec hl ; ld a,l ; or h ; jr nz,DJa ; ld hl,(cJoyAttr) ; inc d ; bit 0,d ; jr z,DJ1 ; call ClearLine ; ld d,1 ; jr DJa1 ; DJ1 call PutLine ; ld d,0 ; DJa1 ld hl,JoyFlashRate ; DJa ld bc,$7CF0 ; call ScanOptiKeys ; jr nc,DJlp ; cp 9 ; jp z,DispKeys ; cp 8 ; jp nc,DispMain ; ld hl,(cJoyAttr) ; call PutLine ; dec a ; ld b,a ; ld a,(cJoy) ; cp b ; jr z,NewJoy ; ld a,b ; ld (cJoy),a ; jp NewJoy ; CalcpJoyAttr ld l,a ; ld h,0 ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; ld de,Attrs+(3*32)+2 ; add hl,de ; ret ; InitOpti ld ix,OptiData ; ld hl,AType ; ld b,nOptions ; ld d,0 ; InitOptiLp push ix ; ld a,(ix+4) ; add a,5 ; ld e,a ; add ix,de ; ld a,(ix) ; ld (hl),a ; inc hl ; pop ix ; ld e,16 ; add ix,de ; djnz InitOptiLp ; ret ; GetString ld ix,HSBuffer ; call InitKbd ; ld a,cMagenta ; call Print ; AElp call ReadKey ; or a ; jr z,AElp ; cp cCret ; ret z ; cp cDel ; jr z,AEDel ; cp Clr ; jr z,AEclr ; cp 8 ; jr c,AE1 ; cp $18 ; jr c,AElp ; AE1 ld e,a ; ld d,wChars/256 ; ld a,(de) ; ld c,a ; ld a,(pCurX) ; add a,c ; cp 255-39 ; jr nc,AElp ; push ix ; pop hl ; ld bc,HSBuffer ; or a ; sbc hl,bc ; ld bc,130 ; or a ; sbc hl,bc ; jr nc,AElp ; ld a,e ; ld (ix),a ; inc ix ; call Print ; jr AElp ; AEDel call AEcDel ; jp AElp ; AEclr call AEcDel ; jr nz,AEclr ; jp AElp ; ; Remove a character/colour code AEcDel ld de,HSBuffer ; push ix ; pop hl ; or a ; sbc hl,de ; add hl,de ; ret z ; dec hl ; ld a,(hl) ; cp 8 ; jr c,DelCC ; push hl ; ld l,a ; ld b,a ; ld h,wChars/256 ; ld e,(hl) ; ld d,0 ; ld hl,(pCurX) ; or a ; sbc hl,de ; ld (pCurX),hl ; ld a,b ; call Print ; ld (pCurX),hl ; pop ix ; or a ; ret ; DelCC ld de,HSBuffer ; ld c,cMagenta ; DCC1 or a ; sbc hl,de ; add hl,de ; jr z,DCC2 ; ld a,(de) ; cp 8 ; jr nc,DCC3 ; ld c,a ; DCC3 inc de ; jr DCC1 ; DCC2 ld a,c ; call Print ; push hl ; pop ix ; or a ; ret ; AcceptEnt ld hl,sAccept ; call PrintStr ; ld hl,(EntryY) ; ld (pCurY),hl ; ld a,9 ; ld (pCurX),a ; call GetString ; push ix ; pop hl ; call MWEntry ; ld (hl),0 ; inc hl ; ld a,(DScore) ; ld (hl),a ; inc hl ; ld a,(DScore+1) ; ld (hl),a ; inc hl ; ld de,HSBuffer ; or a ; sbc hl,de ; ld b,h ; ld c,l ; push bc ; ld hl,(pHSEnd) ; ld de,(pInsert) ; or a ; sbc hl,de ; push hl ; ld hl,(pHSEnd) ; add hl,bc ; ex de,hl ; ld hl,(pHSEnd) ; pop bc ; inc bc ; lddr ; ld hl,HSBuffer ; ld de,(pInsert) ; pop bc ; ldir ; jp DispHS ; MWEntry ld de,HSBuffer ; Is the entry blank? or a ; sbc hl,de ; jr nz,MWE1 ; ; If so we change it to "Someone" for the first 8 tries ; then to "Someone else" after 8 blank entries ; then to "Someone else ( who shall remain nameless)" after 16 ld a,0 ; Self-modifying code... nSomeone equ .-1 ; inc a ; ld (nSomeone),a ; cp 16 ; > 16? ld bc,SomeoneEnd-Someone ; jr nc,MWEa ; cp Someone1 - Someone ; < 8 ld bc,8 ; jr c,MWEa ; ld bc,Someone2-Someone ; 9..15 MWEa ld hl,Someone ; ld de,HSBuffer ; ldir ; ex de,hl ; ret ; Someone defb "Someone" ; Someone1 defb " else" ; Someone2 defb " ( who shall remain nameless )***"; SomeoneEnd equ $ ; MWE1 xor a ; Clear the someone count ld (nSomeone),a ; ld a,l ; Entry > 125 chars? add hl,de ; cp 125 ; jr c,MWE2 ; ; Replace with the long entry text ld hl,TooLong ; ld de,HSBuffer ; ld bc,lTooLong ; ldir ; ex de,hl ; ret ; TooLong defb "What strange behaviour !" ; lTooLong equ .-TooLong ; MWE2 ld ix,sClues ; ld iy,Text ; ld (hl),0 ; push hl ; MWElp push ix ; ld hl,HSBuffer ; Mlp1 ld a,(hl) ; or a ; jr z,Mlpf ; cp $21 ; inc hl ; jr c,Mlp1 ; call ConvLC ; cp (ix) ; inc ix ; jr z,Mlp1 ; dec ix ; Mlpf ld a,(ix) ; or a ; pop ix ; jr z,MWEcg ; StepIX ld a,(ix) ; inc ix ; or a ; jr nz,StepIX ; StepIY ld a,(iy) ; inc iy ; or a ; jr nz,StepIY ; ld a,(ix) ; inc a ; jr nz,MWElp ; pop hl ; ret ; ConvLC cp "Z"+1 ; ret nc ; cp "A" ; ret c ; add a,"a"-"A" ; ret ; MWEcg push iy ; pop de ; pop af ; ld hl,HSBuffer ; CGlp ld a,(de) ; or a ; ret z ; ld (hl),a ; inc hl ; inc de ; jr CGlp ; DispOpti ld hl,sOptiMenu ; call PrintStr ; OptiLoop ld bc,$74A0 ; call ScanOptiKeys ; jr nc,OptiLoop ; cp 5 ; jp z,HexMon ; cp 8 ; jp z,DispMain ; cp 10 ; jp z,DispMain ; dec a ; add a,a ; add a,a ; add a,a ; add a,a ; ld e,a ; ld d,0 ; ld ix,OptiData ; add ix,de ; ld l,(ix+2) ; ld h,(ix+3) ; call PrintStr ; ld a,20 ; ld (ppCurY),a ; ld hl,sBottom ; call PrintStr ; OptiLpA ld a,(ix+4) ; call CalcpVDU ; ld (FlashpDisp),hl ; call GrabLine ; ld d,0 ; OptiLpB ld hl,OptiFlashR ; OptiLp1 ld b,(ix+5) ; ld c,$E0 ; call ScanOptiKeys ; jr c,OptiKP ; dec hl ; ld a,l ; or h ; jr nz,OptiLp1 ; ld a,d ; cpl ; ld d,a ; or a ; push de ; ld hl,(FlashpDisp) ; push af ; call z,PutLine ; pop af ; call nz,ClearLine ; pop de ; jr OptiLpB ; OptiKP cp (ix+4) ; jr z,OptiLp1 ; push af ; ld hl,(FlashpDisp) ; call PutLine ; pop af ; cp 8 ; jp z,DispMain ; cp 9 ; jp nc,DispOpti ; ld (ix+4),a ; push ix ; pop hl ; add a,5 ; ld e,a ; ld d,0 ; add hl,de ; ld a,(hl) ; ld l,(ix+11) ; ld h,(ix+12) ; ld (hl),a ; jr OptiLpA ; CalcpVDU push de ; dec a ; ld l,a ; ld h,0 ; add hl,hl ; ld de,CpV ; add hl,de ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; pop de ; ret ; CpV defw $5882,$58C2,$5942,$5982,$5A22; GrabLine ld de,LineBuffer ; ld bc,30 ; ldir ; ret ; FlashLine dec hl ; ld a,h ; or l ; ret nz ; ld hl,(pKeyVDU) ; ld a,(CurType) ; xor $01 ; ld (CurType),a ; ld a,(UDKat0) ; jr z,FLO ; ld a,(UDKat1) ; FLO ld hl,(pKeyVDU) ; ld d,h ; ld e,l ; inc de ; ld bc,7 ; ld (hl),a ; ldir ; ld hl,UDKfr ; ret ; PutLine ex de,hl ; ld hl,LineBuffer ; ld bc,30 ; ldir ; ret ; ClearLine ld e,l ; ld d,h ; inc de ; ld (hl),$41 ; ld bc,29 ; ldir ; ret ; HexMon ld a,0 ; Self modifying code MonFlag equ .-1 ; or a ; jr nz,HexMon1 ; ld hl,sHexMon ; call PrintStr ; call Input ; call ReadHex16 ; ld de,$1278 ; or a ; sbc hl,de ; jp nz,DispOpti ; ld a,1 ; ld (MonFlag),a ; HexMon1 ld hl,sHexMon1 ; call PrintStr ; MonLoop call Input ; ld a,(de) ; inc de ; or a ; jr z,MonLoop ; cp " " ; jr z,MonLoop ; cp "m" ; jr z,MonM ; cp "t" ; jr z,MonT ; cp "q" ; jp z,DispOpti ; cp "e" ; jr nz,MonLoop ; call ReadHex16 ; jr c,MonErr ; call FrontCallHL ; jp MonLoop ; MonM call ReadHex16 ; jp c,MonErr ; MonMlp call ReadHex8 ; jr z,MonLoop ; jp c,MonErr ; ld (hl),a ; inc hl ; jr MonMlp ; MonT call ReadHex16 ; jr z,MonTa ; jp c,MonErr ; ld (TabPtr),hl ; MonTa call ClearWind ; ld ix,$0000 ; Self modifying code TabPtr equ .-2 ; ld b,8 ; MonTlp push bc ; call TabLine ; pop bc ; djnz MonTlp ; ld (TabPtr),ix ; jp MonLoop ; TabLine push ix ; pop hl ; call PrintHex16 ; ld b,8 ; TLlp ld a," " ; call Print ; ld a,(ix) ; inc ix ; call PrintHex8 ; djnz TLlp ; ld a,cCret ; jp Print ; ClearWind ld hl,$4800 ; CW8 push hl ; call ClearGraph ; pop hl ; ld a,l ; add a,$20 ; ld l,a ; jr nz,CW8 ; ld a,7 ; ld (ppCurY),a ; ld a,cCyan ; call Print ; ld a,cCret ; jp Print ; MonErr ld hl,$40C0 ; ld (pCurY),hl ; xor a ; ld (pCurX),a ; ld hl,sMonError ; call PrintStr ; ld bc,0 ; Err_1 cpi ; jp pe,Err_1 ; ld hl,$40C0 ; call ClearGraph ; jp MonLoop ; ClearGraph call CGa ; inc h ; ld a,h ; and $07 ; ret z ; jr ClearGraph ; CGa push hl ; ld d,h ; ld e,l ; inc de ; ld bc,$001F ; ld (hl),$00 ; ldir ; pop hl ; ret ; Input ld hl,$4080 ; ld (pCurY),hl ; call ClearGraph ; xor a ; ld (pCurX),a ; call GetString ; ld (ix),$00 ; ld de,HSBuffer ; ret ; Hex sub "0" ; ret c ; cp 10 ; ccf ; ret nc ; sub 7+" " ; cp 10 ; ret c ; cp 17 ; ccf ; ret ; ReadHex8 push hl ; call ReadHex16 ; push af ; ld a,h ; or a ; jr z,RH8 ; pop af ; scf ; ld a,l ; pop hl ; ret ; RH8 pop af ; ld a,l ; pop hl ; ret ; ReadHex16 ld a,(de) ; inc de ; cp " " ; jr z,ReadHex16 ; dec de ; ReadHex ld a,(de) ; or a ; scf ; ret z ; call Hex ; ret c ; ld h,0 ; ld l,a ; Read3 inc de ; ld a,(de) ; call Hex ; ccf ; ret nc ; add hl,hl ; ret c ; add hl,hl ; ret c ; add hl,hl ; ret c ; add hl,hl ; ret c ; or l ; ld l,a ; jr Read3 ; Mon call ReadKey ; call Print ; DispDemo ld a,1 ; jp DispGame1 ; DispInst ld hl,sInst ; call PrintStr ; DIlp ld bc,$7FF0 ; call ScanOptiKeys ; jr nc,DIlp ; jp DispMain ; PrintHS push af ; ld (HSChar),a ; ld hl,sHighC ; call PrintStr ; push ix ; pop hl ; ld a,(EntryF) ; or a ; jr nz,PHSb ; PHSa ld a,(hl) ; or a ; inc hl ; jr nz,PHSa ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; ld de,(DScore) ; or a ; sbc hl,de ; jr nc,PHSb ; ld a,1 ; ld (EntryF),a ; ld hl,(pCurY) ; ld (EntryY),hl ; ld (pInsert),ix ; ex de,hl ; jr PHSx ; PHSb ld a,(ix) ; or a ; inc ix ; jr z,PHS2a ; call Print ; jr PHSb ; PHS2a ld l,(ix) ; inc ix ; ld h,(ix) ; inc ix ; ld (pHSEnd),ix ; PHSx ld a,255 - (5*6) ; ld (pCurX),a ; ld a,cYellow ; call Print ; call PrintScore ; ld a,"0" ; call Print ; ld a,cCret ; call Print ; pop af ; ret ; PHS2 inc ix ; PHS3 call PrintSp ; djnz PHS3 ; jr PHS2a ; PrintSp push af ; ld a," " ; call Print ; pop af ; ret ; PrintSp2 push af ; ld a,$80 ; call Print ; pop af ; ret ; PrintScore1 ld c,$80 ; ld b,4 ; jr PS0 ; PrintScore ld c,0 ; ld b,4 ; PS0 call PS1 ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; djnz PS0 ; ret ; PS1 ld a,h ; rrca ; rrca ; rrca ; rrca ; and $0F ; jr z,PS1a ; inc c ; or "0" ; jp Print ; PS1a ld a,c ; cp $80 ; ret z ; and $7F ; jr z,PS2 ; ld a,"0" ; jp Print ; PS2 ld a,(pCurX) ; add a,6 ; ld (pCurX),a ; ret ; OptiData defw 0,sSkillLevels ; defb 2 ; defb $7C ; defb -1,-2,-3,-4,-5 ; defw AType ; defs 3 ; defw 0,sNoises ; defb 3 ; defb $78 ; defb $00,$09,$0F,$FF,$FF ; defw BType ; defs 3 ; defw 0,sDisplay ; defb 1 ; defb $70 ; defb 0,2,3,0,0 ; defw CType ; defs 3 ; VecGoto dec a ; add a,a ; ld l,a ; ld h,0 ; add hl,de ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; FrontCallHL jp (hl) ; MainVecTab defw DispGame ; 1 defw DispMain ; 2 defw DispCont ; 3 defw DispMain ; 4 defw DispMain ; 5 defw DispMain ; 6 defw DispMain ; 7 defw DispMain ; 8 defw DispMain ; 9 defw DispMain ; 10 defw DispHS ; 11 ScanOptiKeys push ix ; push de ; push bc ; call SOK ; pop bc ; pop de ; pop ix ; ret ; SOK ld ix,OptKeyTab ; ld e,12 ; SOKlp rl c ; rl b ; jr c,SOK0 ; push bc ; ld bc,4 ; add ix,bc ; pop bc ; SOKx dec e ; jr nz,SOKlp ; or a ; ret ; SOK0 call SOK1 ; ret c ; jr SOKx ; SOK1 push bc ; ld b,(ix) ; ld c,$FE ; in a,(c) ; or (ix+1) ; inc a ; jr z,SOKnp ; ld a,(ix+2) ; and $0F ; cp 4 ; jr z,SOK2 ; inc (ix+2) ; SOKxf ld bc,4 ; add ix,bc ; or a ; pop bc ; ret ; SOK2 bit 7,(ix+2) ; jr nz,SOKxf ; set 7,(ix+2) ; ld a,(ix+3) ; ld bc,4 ; add ix,bc ; scf ; pop bc ; ret ; SOKnp ld a,(ix+2) ; and $0F ; jr z,SOKxf ; dec (ix+2) ; dec a ; and $0F ; jr nz,SOKxf ; res 7,(ix+2) ; jr SOKxf ; IntRoutine push af ; push hl ; ld a,(CType) ; cp 3 ; jr z,IntIgnore ; jr IntIgnore ; push bc ; push de ; push ix ; push iy ; ld a,(SecCount) ; and $01 ; jr z,Int0 ; call ScrollScore ; ld a,(ADamage) ; ld b,a ; ld a,(DDamage) ; cp b ; call nz,StepEnergy ; Int0 call ScMess ; ld a,(SecCount) ; dec a ; ld (SecCount),a ; cp 25 ; jr z,Int2 ; or a ; call z,SetUpSec ; ld a,(Slice) ; or a ; jr z,Int1 ; dec a ; ld (Slice),a ; call ScrollIt ; Int1 pop iy ; pop ix ; pop de ; Crash pop bc ; pop hl ; pop af ; ei ; ret ; Int2 ld a,$00 ; Colons OFF ld ($0000),a ; SMC CM1 equ .-2 ; ; mem_smc CM1,* - CM1 ; This block is self-modifying code ld ($0000),a ; SMC CM2 equ .-2 ; ; mem_smc CM2,* - CM2 ; This block is self-modifying code jp Int1 ; IntIgnore ld a,(DDamage) ; ld (ADamage),a ; ld hl,(DScore) ; ld (AScore),hl ; pop hl ; pop af ; ei ; ret ; RotDig xor a ; add hl,hl ; rla ; add hl,hl ; rla ; add hl,hl ; rla ; add hl,hl ; rla ; ret ; ScNext ld hl,(ScPtr) ; ld a,(hl) ; inc hl ; ld (ScPtr),hl ; inc a ; ld (Sc_F),a ; jp z,ScNew ; dec a ; jr z,ScN2 ; cp $20 ; jr nc,ScN1 ; ld (ScAttr),a ; ld a,3 ; ld (ScCnt),a ; ld hl,Buff0 ; ld de,Buff1 ; ld bc,7 ; ld (hl),$00 ; ldir ; jr ScIt ; ScN1 ld l,a ; ld h,wChars/256 ; ld a,(hl) ; inc a ; sra a ; ld (ScCnt),a ; ld h,0 ; add hl,hl ; add hl,hl ; add hl,hl ; ld a,0+(pChars/256)-1 ; <> add a,h ; ld h,a ; ld de,Buff0 ; ld bc,8 ; ldir ; jr ScIt ; ScN2 ld a,$7F ; ld (ScCnt),a ; jr ScIt ; ScMess ld a,(Sc_F) ; or a ; jp z,ScNew ; ld a,(ScCnt) ; or a ; jr z,ScNext ; dec a ; ld (ScCnt),a ; ScIt ld a,(ScACnt) ; dec a ; ld (ScACnt),a ; and $3 ; call z,ScAtt ; ld hl,Buff0 ; sla (hl) ; ex af,af' ;;;; sla (hl) ; ex af,af' ;;;; ld hl,$50FF ; call Sc1m ; ld hl,Buff1 ; sla (hl) ; ex af,af' ;;;; sla (hl) ; ex af,af' ;;;; ld hl,$51FF ; call Sc1m ; ld hl,Buff2 ; sla (hl) ; ex af,af' ;;;; sla (hl) ; ex af,af' ;;;; ld hl,$52FF ; call Sc1m ; ld hl,Buff3 ; sla (hl) ; ex af,af' ;;;; sla (hl) ; ex af,af' ;;;; ld hl,$53FF ; call Sc1m ; ld hl,Buff4 ; sla (hl) ; ex af,af' ;;;; sla (hl) ; ex af,af' ;;;; ld hl,$54FF ; call Sc1m ; ld hl,Buff5 ; sla (hl) ; ex af,af' ;;;; sla (hl) ; ex af,af' ;;;; ld hl,$55FF ; call Sc1m ; ld hl,Buff6 ; sla (hl) ; ex af,af' ;;;; sla (hl) ; ex af,af' ;;;; ld hl,$56FF ; call Sc1m ; ld hl,Buff7 ; sla (hl) ; ex af,af' ;;;; sla (hl) ; ex af,af' ;;;; ld hl,$57FF ; Sc1m ld b,8 ; Sc2m rl (hl) ; ex af,af' ;;;; rl (hl) ; ex af,af' ;;;; dec l ; rl (hl) ; ex af,af' ;;;; rl (hl) ; ex af,af' ;;;; dec l ; rl (hl) ; ex af,af' ;;;; rl (hl) ; ex af,af' ;;;; dec l ; rl (hl) ; ex af,af' ;;;; rl (hl) ; ex af,af' ;;;; dec l ; djnz Sc2m ; ret ; ScAtt ld hl,$5AE1 ; ld de,$5AE0 ; ld bc,$1F ; ldir ; ld a,(ScAttr) ; ld (de),a ; ret ; ScNew ld ix,(pScrBuf2) ; ld a,(ix+2) ; or a ; ret z ; ld a,1 ; ld (Sc_F),a ; ld l,(ix) ; ld h,(ix+1) ; ld (ix+2),$00 ; ld (ScPtr),hl ; ScNew1 push ix ; pop hl ; inc hl ; inc hl ; inc hl ; ld de,SetUpSec ; ld (pScrBuf2),hl ; or a ; sbc hl,de ; ret nz ; ld hl,ScrollBuff ; ld (pScrBuf2),hl ; ret ; AddScroll ld a,(CType) ; cp 3 ; ret z ; push ix ; di ; ld ix,(pScrBuf1) ; ld a,(ix+2) ; or a ; jr nz,AScx ; ld (ix),l ; ld (ix+1),h ; ld (ix+2),1 ; push ix ; pop hl ; inc hl ; inc hl ; inc hl ; ld (pScrBuf1),hl ; ld de,SetUpSec ; or a ; sbc hl,de ; jr nz,AScx ; ld hl,ScrollBuff ; ld (pScrBuf1),hl ; AScx pop ix ; ei ; ret ; InitScroll xor a ; ld (Sc_F),a ; ld (ScCnt),a ; ld (ScACnt),a ; ld hl,ScrollBuff ; ld (pScrBuf1),hl ; ld (pScrBuf2),hl ; ld hl,ScrollBuff ; ld de,ScrollBuff+1 ; ld bc,29 ; ld (hl),0 ; ldir ; ret ; SetUpSec ld a,8 ; ld (Slice),a ; ld a,50 ; ld (SecCount),a ; ld a,$47 ; CM0 equ .-1 ; ; mem_smc CM0,* - CM0 ; This block is self-modifying code ld ($0000),a ; CM1a equ .-2 ; ; mem_smc CM1a,* - CM1a ; This block is self-modifying code ld ($0000),a ; CM2a equ .-2 ; ; mem_smc CM2a,* - CM2a ; This block is self-modifying code call AddOne ; ld a,b ; ld (nScroll),a ; ret ; AddOne ld de,FirstDig ; ld hl,p1 ; ld b,1 ; call DoTen ; ret c ; call DoSix ; ret c ; call DoTen ; ret c ; call DoSix ; ret c ; call DoTen ; ret c ; call DoTen ; dec b ; ret ; DoTen ld a,(de) ; inc a ; ld (de),a ; cp 10 ; ret c ; ld (hl),Zero & $FF ; inc hl ; ld (hl),Zero / 256 ; inc hl ; xor a ; ld (de),a ; inc b ; inc de ; ret ; DoSix ld a,(de) ; inc a ; ld (de),a ; cp 6 ; ret c ; ld (hl),Zero & $FF ; inc hl ; ld (hl),Zero / 256 ; inc hl ; xor a ; ld (de),a ; inc b ; inc de ; ret ; ScrollIt ld ix,p1 ; ld a,(nScroll) ; ld b,a ; SIlp ld e,(ix) ; ld d,(ix+1) ; ld l,(ix+12) ; ld h,(ix+13) ; ld c,8 ; SIlp1 ld a,(de) ; inc de ; ld (hl),a ; inc h ; dec c ; jr nz,SIlp1 ; inc (ix) ; inc ix ; inc ix ; djnz SIlp ; ret ; DispGame xor a ; DispGame1 ld (Mode),a ; ld a,cCls ; call Print ; ld a,(cInput) ; cp "J" ; jp z,GameJoy ; call DoKeys ; GameExit call InitInt ; call InitInst ; ld a,(CType) ; cp 3 ; jp z,Play1 ; call InitClock ; call InitScore ; call InitEnergy ; Play1 call IntVec ; ld a,(Mode) ; ld hl,FUM ; or a ; jr z,Mess1 ; ld hl,FUD ; Mess1 call AddScroll ; ld a,(BType) ; bit 3,a ; call SetSoundFlag ; ld (Trumpet),a ; ld (Trumpet1),a ; call Play ; di ; ld a,(Mode) ; or a ; jp nz,DispMain ; ld a,(EndState) ; dec a ; jr z,EndEsc ; EndDead ld hl,sEndDead ; call PrintStr ; ld hl,(DScore) ; call PrintScore1 ; ld hl,sEndDead1 ; call PrintStr ; jp EElp ; EndEsc ld hl,sEndEsc ; call PrintStr ; call GetString ; ld ix,HSBuffer ; call FindCRC ; The correct str -> hl=$DF51 ld de,$DF51 ; or a ; sbc hl,de ; jr z,CodeFound1 ; ld hl,sWrongCode ; call PrintStr ; EElp ld bc,$FFD0 ; call ScanOptiKeys ; jr nc,EElp ; jp DispHS1 ; CodeFound1 ld hl,(DScore) ; ld a,$05 ; add a,h ; daa ; ld h,a ; jr nc,CF2 ; ld hl,$9999 ; CF2 ld (DScore),hl ; ld ix,HSBuffer+2 ; call FindCRC ; The correct str -> hl=$041D ex de,hl ; ld hl,Message ; CodeFlp ld a,(hl) ; xor d ; add a,e ; jr z,EElp ; call Print ; inc hl ; ld bc,MessWait ; MessW cpi ; dec hl ; jp pe,MessW ; jr CodeFlp ; FindCRC ld hl,0 ; ld de,4 ; ld a,8 ; DecLp ld c,(ix) ; ld b,(ix+1) ; add hl,bc ; add ix,de ; dec a ; jr nz,DecLp ; ret ; SetSoundFlag ld a,$00 ; ret z ; ld a,$F8 ; ret ; ; Report problems to the user... Bad idea... FuckUp di ; pop hl ; ld sp,0 ; push hl ; ld hl,sFuckUp ; call PrintStr ; pop hl ; dec hl ; dec hl ; dec hl ; call PrintHex16 ; FUlp ld bc,$0020 ; call ScanOptiKeys ; jr nc,FUlp ; jp Boot ; PrintHex16 ld a,h ; call PrintHex8 ; ld a,l ; PrintHex8 call PH2 ; PH2 rrca ; rrca ; rrca ; rrca ; push af ; and $0F ; add a,"0" ; cp "9"+1 ; jr c,PH3 ; add a,"A"-("9"+1) ; PH3 call Print ; pop af ; ret ; InitEnergy xor a ; ld (ADamage),a ; ld (cMag),a ; ld a,MaxEnergy ; ld (DDamage),a ; ld de,$50A6 ; ld a,(CType) ; or a ; jr z,IEa ; ld de,$50A9 ; IEa ld (pcDial),de ; ld hl,Dial0 ; ld (pcShape),hl ; ld b,nDials ; IElp push de ; push bc ; ld hl,Dial0 ; call Place ; pop bc ; pop de ; inc de ; inc de ; djnz IElp ; ret ; StepEnergy jr nc,SEinc ; ld a,$F8 ; Trumpet equ .-1 ; out ($FE),a ; ; mem_smc Trumpet,*-Trumpet ; ld a,$00 ; cMag equ .-1 ; ; mem_smc cMag,*-cMag ; or a ; ld de,(pcDial) ; ld hl,(pcShape) ; jr nz,SEdec1 ; dec de ; dec de ; ld (pcDial),de ; ld hl,Dial8+32 ; ld a,9 ; SEdec1 dec a ; ld (cMag),a ; ld a,(ADamage) ; dec a ; ld bc,-32 ; jp SEexit ; SEinc ld a,$F8 ; Trumpet1 equ .-1 ; ; mem_smc Trumpet1,1 out ($FE),a ; ld a,(cMag) ; cp 8 ; ld de,(pcDial) ; ld hl,(pcShape) ; jr nz,SEinc1 ; inc de ; inc de ; ld (pcDial),de ; ; Carry on ld hl,Dial0-32 ; ld a,-1 ; SEinc1 inc a ; ld (cMag),a ; ld bc,32 ; ld a,(ADamage) ; inc a ; SEexit ld (ADamage),a ; add hl,bc ; ld (pcShape),hl ; xor a ; out ($FE),a ; Place push de ; call PInner ; pop de ; ld a,e ; add a,$20 ; ld e,a ; PInner ld b,8 ; Inner1 ld a,(hl) ; ld (de),a ; inc hl ; inc e ; ld a,(hl) ; ld (de),a ; inc hl ; dec e ; inc d ; djnz Inner1 ; ret ; InitScore ld hl,ScoreData ; ld de,ScorePtrs ; ld bc,ScorePtrs-ScoreData ; ldir ; ld hl,0 ; ld (DScore),hl ; ld a,(CType) ; Point at the score screen pos ld hl,$50BB ; or a ; jr z,IS1 ; ld hl,$50DB ; IS1 ld (pScore),hl ; ret ; ScrollScore ld a,(ScScrCnt) ; dec a ; jr nz,SSupdate ; ld hl,(AScore) ; ld de,(DScore) ; or a ; sbc hl,de ; ret z ; ex de,hl ; ld (AScore),hl ; ld a,0 ; jr c,SSpos ; ld a,7 ; SSpos ld (ScScrDir),a ; ld ix,ScorePtrs ; ld iy,1 ; ld b,4 ; ld c,ScTab1 & $FF ; ld d,Zero/256 ; SScalc xor a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; push af ; cp (ix+1) ; ld (ix+1),a ; jr z,SSb ; ld a,iyh ; or a ; jr nz,SSb ; ld iyh,iyl ; SSb pop af ; jr z,SSa ; ld c,ScTab2 & $FF ; SSa add a,a ; add a,c ; ld e,a ; ld a,(de) ; ld e,a ; ld a,(ScScrDir) ; add a,e ; ld (ix),a ; inc iyl ; inc ix ; inc ix ; djnz SScalc ; ld a,(ScScrDir) ; add a,Sc0 and $FF ; ld (ix),a ; ld a,iyh ; ld (ScScrNo),a ; ld a,8 ; SSupdate ld (ScScrCnt),a ; ld de,ScreenBase ; pScore equ .-2 ; ; mem_smc pScore, * - pScore ; ld a,(ScScrNo) ; ld iyl,a ; ld a,(ScScrDir) ; add a,d ; cp d ; ld d,a ; jr nz,SSscdown ; SSscup ld hl,ScorePtrs ; ld b,5 ; SSscuplp dec iyl ; jr nz,SSscupX ; inc iyl ; push bc ; push de ; push hl ; ld b,7 ; ld h,d ; ld l,e ; inc h ; SSscuplp1 ld a,(hl) ; ld (de),a ; inc h ; inc d ; djnz SSscuplp1 ; pop hl ; ld c,(hl) ; ld b,Sc0/256 ; ld a,(bc) ; ld (de),a ; inc (hl) ; pop de ; pop bc ; SSscupX inc e ; inc hl ; inc hl ; djnz SSscuplp ; ret ; SSscdown ld hl,ScorePtrs ; ld b,5 ; SSscdolp dec iyl ; jr nz,SSscdoX ; inc iyl ; push bc ; push de ; push hl ; ld b,7 ; ld h,d ; ld l,e ; dec h ; SSscdolp1 ld a,(hl) ; ld (de),a ; dec h ; dec d ; djnz SSscdolp1 ; pop hl ; ld c,(hl) ; ld b,Sc0/256 ; ld a,(bc) ; ld (de),a ; dec (hl) ; pop de ; pop bc ; SSscdoX inc e ; inc hl ; inc hl ; djnz SSscdolp ; ret ; ; Score variables (for the scrolling display) GameJoy call DoKeys ; ld a,(cJoy) ; ld l,a ; ld h,0 ; add hl,hl ; ld d,h ; ld e,l ; add hl,hl ; add hl,hl ; add hl,de ; ld de,JoyVects ; add hl,de ; ld de,kLeft ; ld b,4 ; Joy1 call DoJoy ; djnz Joy1 ; inc de ; inc de ; inc de ; inc de ; inc de ; inc de ; call DoJoy ; jp GameExit ; DoJoy inc de ; ld a,(hl) ; ld (de),a ; inc hl ; inc de ; ld a,(hl) ; ld (de),a ; inc hl ; inc de ; ret ; ; Addresses of Joystick scanning routines JoyVects defw KemL,KemR,KemU,KemD,KemF ; Left,Right,Up,Down,Fire defw FulL,FulR,FulU,FulD,FulF ; defw ProL,ProR,ProU,ProD,ProF ; defw SinL,SinR,SinU,SinD,SinF ; defw SinL,SinR,SinU,SinD,SinF ; ; Scanning routines for the different types of joystick KemL in a,($1F) ; bit 1,a ; ret ; KemR in a,($1F) ; bit 0,a ; ret ; KemU in a,($1F) ; bit 3,a ; ret ; KemD in a,($1F) ; bit 2,a ; ret ; KemF in a,($1F) ; bit 4,a ; ret ; FulL in a,($7F) ; cpl ; bit 2,a ; ret ; FulR in a,($7F) ; cpl ; bit 3,a ; ret ; FulU in a,($7F) ; cpl ; bit 0,a ; ret ; FulD in a,($7F) ; cpl ; bit 1,a ; ret ; FulF in a,($7F) ; cpl ; bit 7,a ; ret ; ProL ld a,$F7 ; in a,($FE) ; cpl ; bit 4,a ; ret ; ProR ld a,$EF ; in a,($FE) ; cpl ; bit 2,a ; ret ; ProU ld a,$EF ; in a,($FE) ; cpl ; bit 3,a ; ret ; ProD ld a,$EF ; in a,($FE) ; cpl ; bit 4,a ; ret ; ProF ld a,$EF ; in a,($FE) ; cpl ; bit 0,a ; ret ; SinL ld a,$EF ; in a,($FE) ; cpl ; bit 4,a ; ret ; SinR ld a,$EF ; in a,($FE) ; cpl ; bit 3,a ; ret ; SinU ld a,$EF ; in a,($FE) ; cpl ; bit 1,a ; ret ; SinD ld a,$EF ; in a,($FE) ; cpl ; bit 2,a ; ret ; SinF ld a,$EF ; in a,($FE) ; cpl ; bit 0,a ; ret ; ; This code compiles the user defined keys into the fastest code to read them DoKeys ld ix,kLeft ; ld iy,UDKWS ; ld de,UDKTab ; ld b,8 ; Game1 push bc ; push de ; ld hl,HSBuffer ; DK1 ld a,(de) ; cp 40 ; jr nc,DK2 ; call Conv ; ld (hl),b ; inc hl ; ld (hl),c ; inc hl ; inc de ; jr DK1 ; Conv ld bc,$FEFE ; inc a ; Conv1 dec a ; ret z ; rlc c ; bit 5,c ; jr nz,Conv1 ; ld c,$FE ; rlc b ; jr Conv1 ; DK2 ld (hl),0 ; ld de,HSBuffer-2 ; DK3 inc de ; inc de ; ld a,(de) ; or a ; jr z,DK5 ; ld h,d ; ld l,e ; DK4 inc hl ; inc hl ; ex af,af' ;;;; ld a,(hl) ; or a ; jr z,DK3 ; ex af,af' ;;;; cp (hl) ; jr nz,DK4 ; inc de ; inc hl ; ex af,af' ;;;; ld a,(de) ; and (hl) ; ld (de),a ; ex af,af' ;;;; ld (hl),$FF ; dec hl ; dec de ; ld (hl),$FF ; jr DK4 ; DK5 ld de,HSBuffer-2 ; DK5a inc de ; inc de ; ld a,(de) ; or a ; jr z,DK5c ; cp $FF ; jr z,DK5a ; inc de ; ld a,(de) ; dec de ; ld h,d ; ld l,e ; inc hl ; DK5b inc hl ; ex af,af' ;;;; ld a,(hl) ; or a ; jr z,DK5a ; ex af,af' ;;;; inc hl ; cp (hl) ; jr nz,DK5b ; dec hl ; ex af,af' ;;;; ld a,(de) ; and (hl) ; ld (de),a ; ex af,af' ;;;; ld (hl),$FF ; inc hl ; ld (hl),$FF ; jr DK5b ; DK5c ld (ix),$C3 ; ld a,iyl ; ld (ix+1),a ; ld a,iyh ; ld (ix+2),a ; inc ix ; inc ix ; inc ix ; ld hl,HSBuffer-2 ; DK6 inc hl ; inc hl ; DK7 ld a,(hl) ; or a ; jr z,DK8 ; cp $FF ; jr z,DK6 ; ld (iy),$3E ; inc iy ; ld a,(hl) ; inc hl ; ld (iy),a ; inc iy ; ld (iy),$DB ; inc iy ; ld (iy),$FE ; inc iy ; ld (iy),$F6 ; inc iy ; ld a,(hl) ; inc hl ; ld (iy),a ; inc iy ; ld (iy),$3C ; inc iy ; ld (iy),$C0 ; inc iy ; jr DK7 ; DK8 ld (iy-1),$C9 ; pop de ; pop bc ; ld a,e ; or $0F ; ld e,a ; inc de ; dec b ; jp nz,Game1 ; ret ; ; Init the interrupt handler InitInt ld hl,IntPage ; ld b,0 ; ld a,IntVec/256 ; IIlp ld (hl),a ; inc hl ; djnz IIlp ; ld (hl),a ; ld a,1 ; ld (SecCount),a ; xor a ; ld (Sc_F),a ; ld a,IntPage/256 ; ld i,a ; im 2 ; ret ; ; Init the clock display InitClock ld hl,ClockDataN ; ld de,Colon1N ; ld bc,Colon2N ; ld a,(CType) ; or a ; ld a,$47 ; jr z,IC0 ; ld a,$7 ; ld hl,ClockDataR ; ld de,Colon1R ; ld bc,Colon2R ; IC0 ld (CM1),de ; ld (CM1a),de ; ld (CM2),bc ; ld (CM2a),bc ; ld (CM0),a ; ld de,p1 ; ld bc,CDEnd-ClockDataN ; ldir ; ld a,(CType) ; or a ; ld a,$1C ; jr z,IC2 ; ld hl,$52C2 ; call IC1 ; ld hl,$52C5 ; IC1 ld (hl),a ; inc h ; ld (hl),a ; inc h ; inc h ; ld (hl),a ; inc h ; ld (hl),a ; ret ; IC2 ld hl,$420E ; call IC1 ; ld hl,$4211 ; jr IC1 ; InitInst ld a,(CType) ; or a ; jr z,InitIN ; cp 3 ; jp z,InitIt ; ld a,0 ; ld (pCurX),a ; ld hl,$50A0 ; ld (pCurY),hl ; call PrintStr1 ; defb "Energy",0 ; ld a,$CE ; ld (pCurX),a ; call PrintStr1 ; defb "Angle",0 ; ld de,$5AA0 ; ld hl,BottDefNR ; NR1 call SetAttr ; jp InitScroll ; ; Init the instruments InitIN xor a ; ld (pCurX),a ; ld hl,ScreenBase ; ld (pCurY),hl ; call PrintStr1 ; defb "Angle",0 ; xor a ; ld (pCurX),a ; ld hl,$50A0 ; ld (pCurY),hl ; call PrintStr1 ; defb "Energy",0 ; ld a,$B8 ; ld (pCurX),a ; call PrintStr1 ; defb "Score",0 ; ld de,Attrs ; ld hl,TopDefN ; call SetAttr ; ld de,$5A80 ; ld hl,BottDefN ; call SetAttr ; call InitScroll ; ld hl,$5680 ; call ILine ; ld hl,$4120 ; call ILine ; ret ; ; Clear the attributes to bright white/black InitIt ld hl,Attrs ; ld de,Attrs+1 ; ld bc,lAttrs-1 ; ld (hl),$47 ; ldir ; ret ; ; Fire-up menu FUM defb $5 ; defb "Forbidden Planet " ; defb $3 ; defb "(c) " ; defb 5 ; defb "Design" ; defb 6 ; defb "Design" ; defb 7 ; defb "Software" ; defb $00,$FF ; ; Fire-up demo FUD defb $5 ; defb "Demo mode" ; defb $00,$FF ; ; Draw a dotted line ILine ld b,$20 ; ILine1 ld (hl),$AA ; inc l ; djnz ILine1 ; ret ; SetAttr ld a,(hl) ; or a ; ret z ; inc hl ; ld b,(hl) ; inc hl ; SAlp ld (de),a ; inc de ; djnz SAlp ; jr SetAttr ; BottDefNR defb $43,$19 ; defb $45,$07 ; defb $47,$08 ; defb $43,$11 ; defb $47,$07 ; defb $07,$20 ; defb $00 ; BottDefN defb $47,$20 ; defb $43,$06 ; defb $43,$10 ; defb $46,$05 ; defb $07,$05 ; defb $43,$06 ; defb $43,$10 ; defb $46,$05 ; defb $07,$05 ; defb $47,$20 ; defb $00 ; TopDefN defb $45,$06 ; defb $47,$1A ; defb $47,$20 ; defb $00 ; OptKeyTab defb $FF,$FF,$84,$00 ; Esc defb $F7,$FE,$00,$01 ; "1" defb $F7,$FD,$00,$02 ; "2" defb $F7,$FB,$00,$03 ; "3" defb $F7,$F7,$00,$04 ; "4" defb $F7,$EF,$00,$05 ; "5" defb $EF,$EF,$84,$06 ; "6" defb $EF,$F7,$84,$07 ; "7" defb $EF,$FB,$84,$08 ; "8" defb $EF,$FD,$84,$09 ; "9" defb $BF,$FE,$84,$0A ; cCret defb $7F,$FE,$00,$0B ; " " ; mem_var OptKeyTab,* - OptKeyTab ; This block is writable UDKdesc defb $80 or "C","S" ; defb "ZXCV" ; defb "ASDFG" ; defb "QWERT" ; defb "12345" ; defb "09876" ; defb "POIUY" ; defb $80 or "C","r" ; defb "LKJH" ; defb $80 or "S","p" ; defb $80 or "S","S" ; defb "MNB" ; ; Menu text sEndDead defb cCls,cCret,cCret,cYellow ; defb "You were killed , scoring "; defb cWhite,0 ; sEndDead1 defb "0 " ; defb cYellow ; defb "points ." ; defb cCret,cCret,cCyan ; defb "Press SPACE",0 ; sEndEsc defb cCls,cCret,cCret,cYellow ; defb "Congratulations ! You escaped from the planet"; defb cCret,cCret,cCyan ; defb "If you can decode it , enter the key ."; defb cCret,cCret,cMagenta,0 ; sWrongCode defb $0D,$0D,$05 ; defb "Sorry , this key does not decode the message"; defb $0D,$0D,$06 ; defb "Press SPACE",$00 ; sFuckUp defb $0C,$06 ; defb "Oh dear ! something's gone wrong !"; defb $0D,$0D,$05 ; defb "Please phone 061-205-6603 and quote this"; defb $0D ; defb "number :- " ; defb $07 ; defb "2.0:",$00 ; sHexMon defb $0C,$05 ; defb "Sorry , this option is not enabled at present"; defb $0D,$0D,$07 ; defb "Press ENTER",$00 ; sHexMon1 defb $0C,$05,$86,$83 ; defb "Quaimon 2" ; defb $0D,$0D,$06 ; defb "(m)od , (t)ab , (e)xec , (q)uit"; defb $00 ; sMonError defb $05 ; defb "Error !" ; defb $00 ; sMainMenu defb $07,$0C,$86 ; defb "Dark Star - Demo" ; defb $0D,$0D ; defb $03 ; defb "An early version with the FP front end"; defb $0D ; defb "bolted on to provide keys.."; defb $0D,$0D ; defb $07 ; defb " 1 " ; defb $03 ; defb " Play the game" ; defb $07 ; defb $0D,$0D ; defb $07 ; defb $0D,$0D ; defb $0D,$0D ; defb " 3 " ; defb $06 ; defb " Select the playing keys and joystick"; defb $07 ; defb $0D,$0D ; defb $07 ; defb $0D,$0D ; defb $0D,$0D ; defb $0D ; defb $0D,$0D ; defb $03 ; defb "Designed without the aid of a computer ."; defb $0D,$0D ; defb "(c) Design Design Software"; defb $00 ; ; These were disassembled back from the object, hence the ugly formatting. sKeysMenu defb $0C,$86,$83,$85,$06,"Present Controls",$0D,$0D,$07; defb " 1 ",$04,"Turn left",$0D,$0D,$07," 2 ",$04; defb "Turn right",$0D,$0D,$07," 3 ",$05; defb "Move Up",$0D,$0D,$07," 4 ",$05,"Move Down",$0D,$0D,$07; defb " 5 ",$06,"Accelerate",$0D,$0D,$07; defb " 6 ",$06,"Decelerate",$0D,$0D,$07; defb " 7 ",$05,"Fire",$0D,$0D,$07," 8 ",$03; defb "Return to main menu ",$07,"9 ",$03; defb "Select Joystick",$0D,$0D,$05,"Press a number between ",$07; defb "'1' ",$05,"and ",$07,"'7' ",$05,"to select the control that you wi"; defb "sh to change .",$0D,$0D,$06," Then type all the keys that yo"; defb "u want for",$0D,"that control and finish by typing the"; defb " ",$07,"'1' ",$06,"key.",$00; sJoysticks defb $0C,$86,$86,$83,$06,"Joystick Menu",$0D,$0D,$0D; defb " 1 ",$04,"Kempston",$07,$0D,$0D," 2 ",$03; defb "Fuller Box",$0D,$0D,$07," 3 ",$06; defb "Protek ( any cursor joystick )",$0D,$0D,$07; defb " 4 ",$05,"Sinclair Interface 2",$0D,$0D,$07; defb " 5 ",$04,"IEEE Interface",$0D,$0D,$0D,$07; defb " 8 ",$03,"Return to main menu ",$07; defb " 9 ",$03,"Select keyboard",$0D,$0D,$0D,$06; defb " Please note that even when you select",$0D; defb "a joystick the keyboard is still used for",$0D; defb "accelerate & deccelerate .",$0D,$0D,$05; defb " If you have a programmable joystick then",$0D; defb "select the Sinclair and define yours to be",$0D; defb "6 = Left 7 = Right 9 = Up 8 = Down 0 = Fire",$00; sSkillLevels defb $0C,$86,$86,$86,$81,$05,"Skill Levels",$0D,$0D,$0D,$0D,$07; defb " 1 ",$05,"Easy",$0D,$0D,$07," 2 ",$06; defb "Normal",$0D,$0D,$0D,$0D,$07," 3 ",$04; defb "Nasty",$0D,$0D,$07," 4 ",$03,"Very nasty",$0D,$0D,$0D,$0D,$0D,$07; defb " 5 ",$05,"Pretty damn devastating !",$00; sNoises defb $0C,$86,$86,$86,$82,$06,"Noises",$0D,$0D,$0D,$0D,$07; defb " 1 ",$05,"None",$0D,$0D,$07," 2 ",$06; defb "Strange",$0D,$0D,$0D,$0D,$07," 3 ",$04; defb "Very Strange",$00 ; sDisplay defb $0C,$86,$86,$86,$82,$03,"Display",$0D,$0D,$0D,$0D,$07; defb " 1 ",$05,"Normal",$0D,$0D,$07," 2 ",$06; defb "Slimline",$0D,$0D,$0D,$0D,$07," 3 ",$04; defb "Wideangle",$00 ; sOptiMenu defb $0C,$86,$86,$84,$04,"Game Options",$0D,$0D,$0D,$0D,$07; defb " 1 ",$05,"Change Skill Factors",$0D,$0D,$07; defb " 2 ",$06,"Change Noises",$0D,$0D,$0D,$0D,$07; defb " 3 ",$03,"Display Format",$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D; sBottom defb $0D,$07," 8 ",$05,"Return to main menu",$0D,$0D,$07; defb " 9 ",$03,"Return to options menu",$00; sInst defb $0C,$86,$86,$84,"Instructions",$0D,$0D,$0D,$03; defb " You must find the code segments and",$0D,$0D; defb "decode them .",$0D,$0D,$04," All the keys are user-defined e"; defb "xcept :-",$0D,$0D,$0D,$0D,$07," 1 ",$05; defb "Displays map .",$0D,$0D,$07," 2 ",$06; defb "Quit Game .",$0D,$0D,$07," 3 ",$04; defb "Display codes found .",$07,$0D,$0D,$0D; defb " 4 ",$05,"Returns to the game from these .",$00; sHighA defb $0C,$86,$86,$82,"Forbidden Planet",$0D,$0D,$86,$86,$84,$05; defb "Hall of Fame",$0D,$0D,$0D,$00; sHighB defb $0D,$0D," Press ",$05,"SPACE ",$06; defb "to play or ",$05,"ENTER ",$06,"for options",$00; sHighC defb $07 ; HSChar defb "1",$92,$03,$00 ; sAccept defb $0D,$0D,$85,"Please type in your entry .",$03,$00; ; The clues for the high-score table modifications... sClues defb "version",0 ; defb "sex",0 ; defb "laser",0 ; defb "fuck",0 ; defb "shit",0 ; defb "help",0 ; defb "designdesign",0 ; defb "pinback",0 ; defb "darkstar",0 ; defb "mon",0 ; defb "corwench",0 ; defb $FF ; ; The text for the high-score table modifications... Text defb "Ver 2.0 [Massaged for zx-spin :( ]",0; defb "Hmmm. . . tricky !",0 ; defb "2mW Helium-Neon 633 nm",0 ; defb "Oh yes please !",0 ; defb "Shit somewhere else !",0 ; defb "Help ?",0 ; defb "What a what a silly silly name !",0; defb "Want yer mouse ?",0 ; defb $22," Hate it ! ",$22,0 ; defb "Let go of my ears - I know my job !",0; defb "Nibble nibble !",0 ; defb $FF ; ; Interrupt table here! ; ; The idea is that we fill a page with the same value then put the z80 in ; IM2, the vectored mode. It doesn't matter what the vector value is because ; all addresses point to the same place... ; ; Took bloody ages to get zxspin's joke of an assembler to do what I wanted ; here. It silently failed but reported problems elsewhere, which is just ; about the only unforgivable sin in an assembler... ; ; This is where the Dark Star source starts, it is unmodified from 1984... ; - oh, except that I changed the number of shields to 10, it was 1. ; ; nStar EQU 18 ; lStar EQU 9 ; StarX EQU 0 ; StarY EQU 2 ; StarZ EQU 4 ; StarAddr EQU 6 ; StarBit EQU 8 ; ; ; nProj EQU 14 ; lProj EQU 19 ; ProjX EQU 0 ; ProjY EQU 2 ; ProjZ EQU 4 ; ProjAddr EQU 6 ; ProjBit EQU 8 ; ProjLife EQU 9 ; ProjDX EQU 10 ; ProjDY EQU 12 ; ProjDZ EQU 14 ; ProjOldX EQU 17 ; ProjOldZ EQU 16 ; ProjOldY EQU 18 ; Range EQU 30 ; FireDelay EQU 1 ; ProjSp EQU 1400 ; ; ; StartY EQU 700 ; LowY EQU 500 ; HighY EQU 24000 ; MinSp EQU 180 ; MaxSp EQU 1200 ; StartZ EQU -MinSp-1 ; Zdvstep EQU -28 ; Xdtstep EQU 5 ; dDX EQU 2 ; Ydtstep EQU 5 ; dDY EQU 2 ; ; ; nObje EQU 6 ; lObje EQU 256 ; ObjeX EQU 0 ; ObjeY EQU 2 ; ObjeZ EQU 4 ; ObjeDY EQU 6 ; ObjeState EQU 8 ; ObjeCnt EQU 9 ; ObjepMove EQU 10 ; ObjeFlag EQU 12 ; ; Bit 0 1 = Alive ; Bit 1 1 = Can Fire ; Bit 2 1 = Can be shot ; Bit 3 1 = Can be hit ; Bit 4 1 = Can explode ; Bit 5 1 = Does not stop bullets ; Bit 6 1 = Scores if flown through ObjeOldX EQU 14 ; ObjeHSize EQU 13 ; ObjeOldZ EQU 15 ; ObjepShp EQU 16 ; ObjenShp EQU 18 ; ObjedX EQU 19 ; ObjedY EQU 21 ; ObjedZ EQU 23 ; ObjeCol EQU 25 ; ObjeMiss EQU 26 ; ObjeOldLines EQU 27 ; GrowthRate EQU -400 ; ShrinkRate EQU -200 ; lObjeLine EQU 21 ; TWidth EQU #100 ; GWidth EQU #200 ; TMAWidth EQU #680 ; HoriBitl EQU 2 ; HoriBitr EQU 3 ; HoriLeng EQU 4 ; HoriAddr EQU 5 ; AnyA EQU 2 ; AnyB EQU 3 ; AnyC EQU 4 ; AnyD EQU 5 ; AnyE EQU 6 ; AnyL EQU 7 ; AnyH EQU 8 ; AnyA1 EQU 9 ; AnyB1 EQU 10 ; AnyC1 EQU 11 ; AnyD1 EQU 12 ; AnyE1 EQU 13 ; AnyL1 EQU 14 ; AnyH1 EQU 15 ; AnySxx EQU 16 ; AnyBit EQU 16 ; AnySyy EQU 17 ; AnyHV EQU 18 ; AnyIXl EQU 19 ; AnyIXh EQU 20 ; ; ; OneSht EQU #8000 ; TTrdSht EQU #5800 ; TQrdSht EQU #6400 ; X13 EQU #C000 ; X23 EQU #0000 ; X33 EQU #4000 ; X14 EQU #C000 ; X24 EQU #E800 ; X34 EQU #1800 ; X44 EQU #4000 ; X15 EQU #C000 ; X25 EQU #E000 ; X35 EQU #0000 ; X45 EQU #2000 ; X55 EQU #4000 ; sTri EQU 0 ; sSqu EQU 1 ; sTMA EQU 2 ; sGun EQU 3 ; sShape EQU 4 ; ; ; ORG #9400 ; GameCode CALL GenYTab ; CALL Gen192Tab ; LD HL,0 ; LD (DeltaX),HL ; LD (DeltaY),HL ; LD (XTurnRatio),HL ; LD (YDiveRatio),HL ; LD HL,StartZ ; LD (DeltaZ),HL ; XOR A ; LD (OldX),A ; LD (OldY),A ; LD (nMiss),A ; LD A,10 ; Changed 2008 LD (nShields),A ; LD HL,BitTab ; LD A,#80 ; GenXTab LD (HL),A ; INC L ; RRCA ; JR NC GenXTab ; LD A,#FF ; GenXTab1 LD (HL),A ; INC L ; SRL A ; OR A ; JR NZ GenXTab1 ; LD A,#80 ; GenXTab2 LD (HL),A ; INC L ; SRA A ; CP #FF ; JR NZ GenXTab2 ; LD (HL),A ; CALL SetUpStars ; CALL SetUpProj ; CALL SetUpObje ; LD HL,SheetI ; LD (pSheet),HL ; LD HL,#FF00 ; LD (SheetZ),HL ; CALL CLS ; Loop1 CALL SetUpSheet ; Loop LD HL,(GroundY) ; LD DE,(DeltaY) ; ADD HL,DE ; LD (GroundY),HL ; CALL ShowStars ; CALL ShowProj ; CALL ShowObje ; CALL AlterSteps ; CALL DrawSights ; CALL FireIfNess ; CALL Rand ; LD A,E ; LD R,A ; IN A,(#3F) ; OR #FC ; INC A ; ; JR NZ EndIt LD HL,(SheetZ) ; LD DE,(DeltaZ) ; ADD HL,DE ; LD (SheetZ),HL ; BIT 7,H ; JR Z Loop1 ; LD A,(nShields) ; OR A ; JR NZ Loop ; EndIt LD HL,#0200 ; vRet RET ; ; ; HitMan LD A,(nShields) ; DEC A ; LD (nShields),A ; RET ; SetUpSheet LD IX,(pSheet) ; LD L,(IX) ; LD H,(IX+1) ; LD (pSheet),HL ; LD L,(IX+2) ; LD H,(IX+3) ; LD DE,(SheetZ) ; ADD HL,DE ; LD (SheetZ),HL ; LD DE,4 ; ADD IX,DE ; SUS CALL gpObje ; RET C ; CALL CreateObje ; LD L,(IX) ; LD H,(IX+1) ; LD (IY+ObjeX),L ; LD (IY+ObjeX+1),H ; INC IX ; INC IX ; LD L,(IX) ; INC IX ; LD H,0 ; ADD HL,HL ; ADD HL,HL ; ADD HL,HL ; ADD HL,HL ; LD DE,ObjeData ; ADD HL,DE ; LD A,(HL) ; LD (IY+ObjepMove),A ; INC HL ; LD A,(HL) ; LD (IY+ObjepMove+1),A ; INC HL ; LD A,(HL) ; LD (IY+ObjeHSize),A ; INC HL ; LD A,(HL) ; LD (IY+ObjeCol),A ; INC HL ; LD E,(HL) ; INC HL ; LD D,(HL) ; INC HL ; CALL CallDE ; LD A,(IX) ; OR A ; RET Z ; INC IX ; JR SUS ; CallDE PUSH DE ; RET ; gpObje LD IY,ObjeTable ; LD B,nObje ; LD DE,lObje ; gpOlp OR A ; BIT 0,(IY+ObjeFlag) ; RET Z ; ADD IY,DE ; DJNZ gpOlp ; SCF ; RET ; hShape LD A,(IX) ; INC IX ; LD (IY+ObjepShp),A ; LD A,(IX) ; INC IX ; LD (IY+ObjepShp+1),A ; LD A,(IX) ; INC IX ; LD (IY+ObjenShp),A ; RET ; hGun SET 1,(IY+ObjeFlag) ; RET ; hTMA LD (IY+ObjeFlag),#49 ; RET ; ObjeData DEFW pTriTow ; DEFB 2 ; DEFB #46 ; DEFW vRet ; DEFS 16-6 ; DEFW pSquTow ; DEFB 2 ; DEFB #45 ; DEFW vRet ; DEFS 16-6 ; DEFW pTMATow ; DEFB 8 ; DEFB #47 ; DEFW hTMA ; DEFS 16-6 ; DEFW pTriTow ; DEFB 2 ; DEFB #43 ; DEFW hGun ; DEFS 16-6 ; DEFW pShape ; DEFB 2 ; DEFB #45 ; DEFW hShape ; DEFS 16-6 ; DrawSights LD DE,(XTurnRatio) ; LD HL,(YDiveRatio) ; SRA H ; RR L ; LD A,L ; XOR #80 ; LD L,A ; SRA D ; RR E ; LD A,E ; XOR #80 ; CP 4 ; JR NC DS1 ; LD A,4 ; JP DS3 ; DS1 CP 251 ; JR C DS3 ; LD A,251 ; DS3 LD E,A ; LD H,DivTab/256 ; LD L,(HL) ; DEC L ; DEC L ; DEC L ; LD A,E ; SUB 3 ; RRCA ; RRCA ; RRCA ; AND #1F ; LD D,A ; LD A,E ; SUB 3 ; AND #07 ; ADD A,A ; ADD A,A ; ADD A,A ; ADD A,A ; LD C,A ; LD B,0 ; LD IX,Sights ; ADD IX,BC ; LD E,L ; LD HL,(SighDE) ; OR A ; SBC HL,DE ; LD A,L:OR H ; JR NZ PutS2 ; PUSH IX ; POP BC ; LD HL,(SighIX) ; OR A ; SBC HL,BC ; LD A,L:OR H ; JR Z PutS1 ; PutS2 PUSH IX ; PUSH DE ; CALL UnDrawSights ; POP DE ; POP IX ; LD (SighDE),DE ; LD (SighIX),IX ; PutS1 LD B,7 ; PutClp LD L,E ; LD H,YTable/256 ; LD A,(HL) ; INC H ; LD H,(HL) ; ADD A,D ; LD L,A ; LD A,(IX) ; OR (HL) ; LD (HL),A ; INC IX ; INC L ; LD A,(IX) ; OR (HL) ; LD (HL),A ; INC E ; INC IX ; DJNZ PutClp ; RET ; UnDrawSights LD DE,(SighDE) ; LD IX,(SighIX) ; LD B,7 ; RemClp LD L,E ; LD H,YTable/256 ; LD A,(HL) ; INC H ; LD H,(HL) ; ADD A,D ; LD L,A ; LD A,(IX) ; CPL ; AND (HL) ; LD (HL),A ; INC IX ; INC L ; LD A,(IX) ; CPL ; AND (HL) ; LD (HL),A ; INC E ; INC IX ; DJNZ RemClp ; RET ; Sights DEFB #10,#00,#10,#00,0,0 ; DEFB #C6,#00,0,0 ; DEFB #10,#00,#10,#00,0,0 ; DEFB #08,#00,#08,#00,0,0 ; DEFB #63,#00,0,0 ; DEFB #08,#00,#08,#00,0,0 ; DEFB #04,#00,#04,#00,0,0 ; DEFB #31,#80,0,0 ; DEFB #04,#00,#04,#00,0,0 ; DEFB #02,#00,#02,#00,0,0 ; DEFB #18,#C0,0,0 ; DEFB #02,#00,#02,#00,0,0 ; DEFB #01,#00,#01,#00,0,0 ; DEFB #0C,#60,0,0 ; DEFB #01,#00,#01,#00,0,0 ; DEFB #00,#80,#00,#80,0,0 ; DEFB #06,#30,0,0 ; DEFB #00,#80,#00,#80,0,0 ; DEFB #00,#40,#00,#40,0,0 ; DEFB #03,#18,0,0 ; DEFB #00,#40,#00,#40,0,0 ; DEFB #00,#20,#00,#20,0,0 ; DEFB #01,#8C,0,0 ; DEFB #00,#20,#00,#20,0,0 ; CallHL JP (HL) ; GenYTab LD HL,YTable ; LD DE,#4000 ; LD C,24 ; CharLp LD B,8 ; CharLp1 LD (HL),E ; INC H ; LD (HL),D ; DEC H ; INC L ; INC D ; DJNZ CharLp1 ; LD A,D ; SUB 8 ; LD D,A ; DEC C ; JR Z GYT1 ; LD A,E ; ADD A,32 ; LD E,A ; JR NC CharLp ; LD A,D ; ADD A,8 ; LD D,A ; JR CharLp ; GYT1 LD B,#40 ; GYT2 LD (HL),0 ; INC H ; LD (HL),0 ; DEC H ; INC L ; DJNZ GYT2 ; RET ; CLS LD HL,#4000 ; LD DE,#4001 ; LD BC,#1800 ; LD (HL),0 ; LDIR ; LD BC,#2FF ; LD A,(GameAttr) ; LD (HL),A ; LDIR ; XOR A ; OUT (#FE),A ; RET ; Rand CALL Rand1 ; LD DE,(Seed) ; RET ; Rand1 LD HL,(Seed+2) ; RL L ; RL H ; RL L ; RL H ; LD C,H ; LD A,(Seed) ; RLA ; LD B,A ; LD DE,(Seed+1) ; RL E ; RL D ; RES 7,D ; LD HL,(Seed) ; ADD HL,BC ; LD (Seed),HL ; LD HL,(Seed+2) ; ADC HL,DE ; RES 7,H ; LD (Seed+2),HL ; RET M ; LD HL,Seed ; Rand2 INC (HL) ; RET NZ ; INC HL ; JR Rand2 ; Seed DEFB "Nig!" ; GameAttr DEFB #07 ; Gen192Tab LD BC,DivTab ; LD HL,0 ; LD DE,#00B0 ; G192 LD A,H ; LD (BC),A ; ADD HL,DE ; INC C ; JR NZ G192 ; RET ; DivHLDE XOR A ; SBC HL,DE ; ADD HL,DE ; JR C Div6 ; JR Z Div1 ; LD A,D ; OR A ; JR NZ Div2 ; LD A,H ; CP E ; JR NC Div3 ; Div2 LD A,L ; LD L,H ; LD H,0 ; LD B,8 ; Div4 ADD A,A ; ADC HL,HL ; SBC HL,DE ; JR NC Div5 ; ADD HL,DE ; DJNZ Div4 ; JP Div6 ; Div5 INC A ; DJNZ Div4 ; Div6 LD C,A ; LD B,8 ; Div7 ADD A,A ; ADD HL,HL ; SBC HL,DE ; JR NC Div8 ; ADD HL,DE ; DJNZ Div7 ; LD H,C ; LD L,A ; RET ; Div8 INC A ; DJNZ Div7 ; LD H,C ; LD L,A ; RET ; Div1 LD HL,#0100 ; RET ; Div3 RET ; ObjeDiv BIT 7,H ; JR NZ OD1 ; CALL DivHLDE ; SRL H ; RR L ; RET ; OD1 LD A,L ; CPL ; LD L,A ; LD A,H ; CPL ; LD H,A ; INC HL ; CALL DivHLDE ; LD A,L ; CPL ; LD L,A ; LD A,H ; CPL ; LD H,A ; INC HL ; SRA H ; RR L ; RET ; ShapeDiv PUSH BC ; CALL ObjeDiv ; POP BC ; RET ; MultHLDE LD B,H ; LD C,L ; LD HL,0 ; LD A,C ; LD C,B ; LD B,8 ; RRA ; Mul0 JR NC Mul1 ; ADD HL,DE ; Mul1 RR H ; RL L ; RRA ; DJNZ Mul0 ; LD B,A ; LD A,C ; LD C,B ; LD B,8 ; RRA ; Mul2 JR NC Mul3 ; ADD HL,DE ; Mul3 RR H ; RR L ; RRA ; DJNZ Mul2 ; LD H,L ; LD L,A ; RET ; SignMult BIT 7,H ; JR Z SM1 ; LD A,H ; CPL ; LD H,A ; LD A,L ; CPL ; LD L,A ; INC HL ; BIT 7,D ; JR Z SMn ; LD A,D ; CPL ; LD D,A ; LD A,E ; CPL ; LD E,A ; INC DE ; SMp JP MultHLDE ; SMn CALL MultHLDE ; LD A,H ; CPL ; LD H,A ; LD A,L ; CPL ; LD L,A ; INC HL ; RET ; SM1 BIT 7,D ; JR Z MultHLDE ; LD A,D ; CPL ; LD D,A ; LD A,E ; CPL ; LD E,A ; INC DE ; JP SMn ; SignDiv BIT 7,H ; JR Z SD1 ; LD A,H ; CPL ; LD H,A ; LD A,L ; CPL ; LD L,A ; INC HL ; BIT 7,D ; JR Z SDn ; LD A,D ; CPL ; LD D,A ; LD A,E ; CPL ; LD E,A ; INC DE ; SDp JP DivHLDE ; SDn CALL DivHLDE ; LD A,H ; CPL ; LD H,A ; LD A,L ; CPL ; LD L,A ; INC HL ; RET ; SD1 BIT 7,D ; JP Z DivHLDE ; LD A,D ; CPL ; LD D,A ; LD A,E ; CPL ; LD E,A ; INC DE ; JP SDn ; CalcAddr LD BC,128 ; ADD HL,BC ; EX DE,HL ; ADD HL,BC ; EX DE,HL ; LD H,DivTab/256 ; LD L,(HL) ; LD H,YTable/256 ; LD A,(HL) ; INC H ; LD H,(HL) ; LD L,A ; LD A,E ; RRCA ; RRCA ; RRCA ; AND #1F ; OR L ; LD L,A ; LD A,E ; AND #7 ; LD E,A ; LD D,BitTab/256 ; LD A,(DE) ; RET ; NegHL LD A,L ; CPL ; LD L,A ; LD A,H ; CPL ; LD H,A ; INC HL ; RET ; ; ; SetUpStars LD IX,StarTable ; LD B,nStar ; SUSlp PUSH BC ; CALL Rand ; LD (IX+StarX),E ; LD (IX+StarX+1),D ; CALL Rand ; LD (IX+StarZ),E ; LD (IX+StarZ+1),D ; LD DE,StartY ; LD (IX+StarY),E ; LD (IX+StarY+1),D ; LD (IX+StarBit),0 ; LD BC,lStar ; ADD IX,BC ; POP BC ; DJNZ SUSlp ; LD HL,StartY ; LD (GroundY),HL ; RET ; ShowStars LD IX,StarTable ; LD HL,(DeltaX) ; LD DE,(DeltaY) ; LD BC,(DeltaZ) ; EXX ; LD B,nStar ; SSlp PUSH BC ; EXX ; LD A,L ; ADD A,(IX+StarX) ; LD (IX+StarX),A ; LD A,H ; ADC A,(IX+StarX+1) ; LD (IX+StarX+1),A ; LD A,E ; ADD A,(IX+StarY) ; LD (IX+StarY),A ; LD A,D ; ADC A,(IX+StarY+1) ; LD (IX+StarY+1),A ; LD A,C ; ADD A,(IX+StarZ) ; LD (IX+StarZ),A ; LD A,B ; ADC A,(IX+StarZ+1) ; LD (IX+StarZ+1),A ; EXX ; LD L,(IX+StarAddr) ; LD A,(IX+StarBit) ; LD H,(IX+StarAddr+1) ; CPL ; AND (HL) ; LD (HL),A ; LD (IX+StarBit),0 ; SS1 BIT 7,(IX+StarZ+1) ; JR NZ SSn ; LD L,(IX+StarX) ; LD H,(IX+StarX+1) ; LD E,(IX+StarZ) ; LD D,(IX+StarZ+1) ; BIT 7,H ; JR NZ SSW1 ; OR A ; SBC HL,DE ; JR NC SSn ; ADD HL,DE ; CALL DivHLDE ; SRL H ; RR L ; JP SS2 ; SSn1 POP AF ; SSn LD A,R ; ADD A,A ; LD (IX+StarX+1),A ; LD (IX+StarZ+1),#7F ; JP SSlpx ; SSW1 LD A,L:CPL:LD L,A ; LD A,H:CPL:LD H,A ; INC HL ; OR A ; SBC HL,DE ; JP NC SSn ; ADD HL,DE ; CALL DivHLDE ; SRL H ; RR L ; LD A,L:CPL:LD L,A ; LD H,#FF ; INC HL ; SS2 PUSH HL ; LD L,(IX+StarY) ; LD H,(IX+StarY+1) ; LD E,(IX+StarZ) ; LD D,(IX+StarZ+1) ; BIT 7,H ; JR NZ SSW1a ; OR A ; SBC HL,DE ; JP NC SSn1 ; ADD HL,DE ; CALL DivHLDE ; SRL H ; RR L ; JP SS2a ; SSW1a LD A,L:CPL:LD L,A ; LD A,H:CPL:LD H,A ; INC HL ; OR A ; SBC HL,DE ; JP NC SSn1 ; ADD HL,DE ; CALL DivHLDE ; SRL H ; RR L ; LD A,L:CPL:LD L,A ; LD H,#FF ; INC HL ; SS2a POP DE ; CALL CalcAddr ; LD (IX+StarAddr),L ; LD (IX+StarAddr+1),H ; LD (IX+StarBit),A ; OR (HL) ; LD (HL),A ; SSlpx LD BC,lStar ; ADD IX,BC ; POP BC ; DEC B ; JP NZ SSlp ; RET ; SSlpx1 POP AF ; LD BC,lStar ; ADD IX,BC ; POP BC ; DEC B ; JP NZ SSlp ; RET ; SetUpProj LD IX,ProjTable ; LD B,nProj ; LD DE,lProj ; XOR A ; SUPlp LD (IX+ProjLife),A ; ADD IX,DE ; DJNZ SUPlp ; LD HL,FireDelay ; LD (FireDel),HL ; XOR A ; LD (SideSel),A ; LD A,#40 ; LD (TopSel),A ; RET ; DEFB "Here we go again!" ; ShowProj LD IX,ProjTable ; LD B,nProj ; SPlp PUSH BC ; LD A,(IX+ProjLife) ; OR A ; JP Z SPlpx ; XOR A ; OUT (#FE),A ; LD L,(IX+ProjX) ; LD H,(IX+ProjX+1) ; LD (IX+ProjOldX),H ; LD BC,(DeltaX) ; ADD HL,BC ; LD C,(IX+ProjDX) ; LD B,(IX+ProjDX+1) ; ADD HL,BC ; LD (IX+ProjX),L ; LD (IX+ProjX+1),H ; LD L,(IX+ProjY) ; LD H,(IX+ProjY+1) ; LD (IX+ProjOldY),H ; LD BC,(DeltaY) ; ADD HL,BC ; LD C,(IX+ProjDY) ; LD B,(IX+ProjDY+1) ; ADD HL,BC ; LD (IX+ProjY),L ; LD (IX+ProjY+1),H ; LD BC,(GroundY) ; OR A ; SBC HL,BC ; BIT 7,H ; JR NZ SPa ; LD (IX+ProjY+1),B ; LD (IX+ProjLife),1 ; SPa LD L,(IX+ProjZ) ; LD H,(IX+ProjZ+1) ; LD (IX+ProjOldZ),H ; LD BC,(DeltaZ) ; ADD HL,BC ; LD C,(IX+ProjDZ) ; LD B,(IX+ProjDZ+1) ; ADD HL,BC ; LD (IX+ProjZ),L ; LD (IX+ProjZ+1),H ; LD A,(IX+ProjBit) ; LD L,(IX+ProjAddr) ; LD H,(IX+ProjAddr+1) ; CPL ; AND (HL) ; LD (HL),A ; LD (IX+ProjBit),0 ; LD A,0 ; FireNoiseF EQU $-1 ; OUT (#FE),A ; SP1 BIT 7,(IX+ProjZ+1) ; JP NZ SPKill ; DEC (IX+ProjLife) ; JP Z SPlpx ; ; Now do collisions LD IY,ObjeTable ; LD B,nObje ; Hitlp LD A,(IY+ObjeFlag) ; XOR #01 ; AND #21 ; JP NZ Hitlpx1 ; PUSH BC ; LD A,(IX+ProjZ+1) ; LD C,A ; SUB (IY+ObjeZ+1) ; LD B,A ; LD A,(IX+ProjOldZ) ; SUB (IY+ObjeOldZ) ; XOR B ; JP P Hitlpx ; LD A,(IX+ProjOldX) ; ADD A,(IX+ProjX+1) ; RRA ; LD B,A ; LD A,(IY+ObjeOldX) ; ADD A,(IY+ObjeX+1) ; RRA ; SUB B ; JP P Hita ; NEG ; Hita CP (IY+ObjeHSize) ; JR NC Hitlpx ; LD L,(IX+ProjY) ; LD H,(IX+ProjY+1) ; LD E,(IY+ObjeY) ; LD D,(IY+ObjeY+1) ; OR A ; SBC HL,DE ; BIT 7,H ; JR Z Moved ; Hitlpx POP BC ; Hitlpx1 LD DE,lObje ; ADD IY,DE ; DJNZ Hitlp ; HO3 LD L,(IX+ProjX) ; LD H,(IX+ProjX+1) ; LD E,(IX+ProjZ) ; LD D,(IX+ProjZ+1) ; BIT 7,H ; JR NZ SPW1 ; OR A ; SBC HL,DE ; JP NC SPlpx ; ADD HL,DE ; CALL DivHLDE ; SRL H ; RR L ; JP SP2 ; Moved PUSH IY ; LD (IX+ProjLife),0 ; BIT 2,(IY+ObjeFlag) ; JR Z HO2 ; LD A,(IY+ObjeState) ; CP 2 ; JR Z HO1 ; LD (IY+ObjeState),2 ; JR HO2 ; HO1 LD L,(IY+ObjeDY) ; LD H,(IY+ObjeDY+1) ; LD DE,ShrinkRate ; ADD HL,DE ; LD (IY+ObjeDY),L ; LD (IY+ObjeDY+1),H ; HO2 POP IY ; POP BC ; JP SPlpx ; SPW1 LD A,L:CPL:LD L,A ; LD A,H:CPL:LD H,A ; INC HL ; OR A ; SBC HL,DE ; JP NC SPlpx ; ADD HL,DE ; CALL DivHLDE ; SRL H ; RR L ; LD A,L:CPL:LD L,A ; LD H,#FF ; INC HL ; SP2 PUSH HL ; LD L,(IX+ProjY) ; LD H,(IX+ProjY+1) ; LD E,(IX+ProjZ) ; LD D,(IX+ProjZ+1) ; BIT 7,H ; JR NZ SPW1a ; OR A ; SBC HL,DE ; JP NC SPlpx1 ; ADD HL,DE ; CALL DivHLDE ; SRL H ; RR L ; JP SP2a ; SPW1a LD A,L:CPL:LD L,A ; LD A,H:CPL:LD H,A ; INC HL ; OR A ; SBC HL,DE ; JP NC SPlpx1 ; ADD HL,DE ; CALL DivHLDE ; SRL H ; RR L ; LD A,L:CPL:LD L,A ; LD H,#FF ; INC HL ; SP2a POP DE ; CALL CalcAddr ; LD (IX+ProjAddr),L ; LD (IX+ProjAddr+1),H ; LD (IX+ProjBit),A ; OR (HL) ; LD (HL),A ; SPlpx LD BC,lProj ; ADD IX,BC ; POP BC ; DEC B ; JP NZ SPlp ; RET ; SPKill LD (IX+ProjLife),0 ; LD A,(IX+ProjBit) ; CPL ; LD L,(IX+ProjAddr) ; LD H,(IX+ProjAddr+1) ; AND (HL) ; LD (HL),A ; LD (IX+ProjBit),0 ; PUSH AF ; SPlpx1 POP AF ; LD BC,lProj ; ADD IX,BC ; POP BC ; DEC B ; JP NZ SPlp ; RET ; FireIfNess LD HL,(FireDel) ; XOR A ; LD (FireNoiseF),A ; LD A,L ; OR H ; JR Z FIN1 ; DEC HL ; LD (FireDel),HL ; CALL kFire ; RET Z ; LD A,#F8 ; LD (FireNoiseF),A ; RET ; FIN1 CALL kFire ; RET Z ; LD A,#F8 ; LD (FireNoiseF),A ; LD IX,ProjTable ; LD B,nProj ; LD DE,lProj ; FINlp LD A,(IX+ProjLife) ; OR A ; JR Z FIN2 ; ADD IX,DE ; DJNZ FINlp ; RET ; FIN2 LD (IX+ProjLife),Range ; XOR A ; LD (IX+ProjY+1),A ; LD (IX+ProjZ),A ; LD (IX+ProjZ+1),A ; LD (IX+ProjBit),A ; LD HL,(FireDX) ; LD (IX+ProjDX),L ; LD (IX+ProjDX+1),H ; LD HL,(FireDY) ; LD (IX+ProjDY),L ; LD (IX+ProjDY+1),H ; LD HL,(FireDZ) ; LD (IX+ProjDZ),L ; LD (IX+ProjDZ+1),H ; LD A,(SideSel) ; CPL ; LD (SideSel),A ; OR A ; JR NZ FIN3 ; LD A,(TopSel) ; XOR #80 ; LD (TopSel),A ; FIN3 LD A,(SideSel) ; LD (IX+ProjX+1),A ; LD (IX+ProjX),#80 ; LD A,(TopSel) ; LD (IX+ProjY),A ; LD HL,FireDelay ; LD (FireDel),HL ; RET ; SetUpObje LD HL,ObjeTable+ObjeFlag ; LD DE,lObje ; LD B,nObje ; SUOlp LD (HL),0 ; ADD HL,DE ; DJNZ SUOlp ; RET ; CreateObje LD HL,ObjeTemp ; PUSH IY ; POP DE ; LD BC,#80 ; LDIR ; LD (IY+ObjeZ),#00 ; LD (IY+ObjeZ+1),#7F ; LD HL,(GroundY) ; LD (IY+ObjeY),L ; LD (IY+ObjeY+1),H ; RET ; ShowObje LD IX,ObjeTable ; LD B,nObje ; SOlp PUSH BC ; BIT 0,(IX+ObjeFlag) ; JP Z SOlpx ; LD A,(IX+ObjeCol) ; LD (Colour),A ; LD L,(IX+ObjeX) ; LD H,(IX+ObjeX+1) ; LD (IX+ObjeOldX),H ; LD BC,(DeltaX) ; ADD HL,BC ; LD C,(IX+ObjedX) ; LD B,(IX+ObjedX+1) ; ADD HL,BC ; LD (IX+ObjeX),L ; LD (IX+ObjeX+1),H ; LD L,(IX+ObjeY) ; LD H,(IX+ObjeY+1) ; LD BC,(DeltaY) ; ADD HL,BC ; LD C,(IX+ObjedY) ; LD B,(IX+ObjedY+1) ; ADD HL,BC ; LD (IX+ObjeY),L ; LD (IX+ObjeY+1),H ; LD L,(IX+ObjeZ) ; LD H,(IX+ObjeZ+1) ; LD (IX+ObjeOldZ),H ; LD BC,(DeltaZ) ; ADD HL,BC ; LD C,(IX+ObjedZ) ; LD B,(IX+ObjedZ+1) ; ADD HL,BC ; LD (IX+ObjeZ),L ; LD (IX+ObjeZ+1),H ; BIT 7,(IX+ObjeZ+1) ; JP NZ SOlpx1 ; LD A,(nMiss) ; CP 3 ; JR Z NF ; BIT 1,(IX+ObjeFlag) ; JR Z NF ; LD A,R ; AND #17 ; CALL Z OFire ; NF LD A,(IX+ObjeState) ; OR A ; JR Z SOGrow ; DEC A ; JR Z SOdraw ; DEC A ; JR NZ SOdraw ; LD L,(IX+ObjeY) ; LD H,(IX+ObjeY+1) ; LD E,(IX+ObjeDY) ; LD D,(IX+ObjeDY+1) ; OR A ; SBC HL,DE ; LD (IX+ObjeY),L ; LD (IX+ObjeY+1),H ; LD DE,(GroundY) ; OR A ; SBC HL,DE ; BIT 7,H ; JR NZ SOdraw ; RES 0,(IX+ObjeFlag) ; JR SOlpxz ; SOGrow DEC (IX+ObjeCnt) ; JR Z SOnState ; LD L,(IX+ObjeY) ; LD H,(IX+ObjeY+1) ; LD E,(IX+ObjeDY) ; LD D,(IX+ObjeDY+1) ; ADD HL,DE ; LD (IX+ObjeY),L ; LD (IX+ObjeY+1),H ; JR SOdraw ; SOnState INC (IX+ObjeState) ; LD HL,ShrinkRate ; LD (IX+ObjeDY),L ; LD (IX+ObjeDY+1),H ; SOdraw LD A,(IX+ObjeZ+1) ; CP #7E ; JR NC SOlpx ; RES 0,(IX+ObjeFlag) ; LD L,(IX+ObjepMove) ; LD H,(IX+ObjepMove+1) ; CALL CallHL ; JR C SOlpz ; SOlpxz PUSH IX ; POP IY ; LD BC,ObjeOldLines ; ADD IY,BC ; PUSH IY ; CALL RemoveLines ; POP IY ; CALL TidyMiss ; SOlpz LD (IY),nLine&#FF ; LD (IY+1),nLine/256 ; SOlpx LD BC,lObje ; ADD IX,BC ; POP BC ; DEC B ; JP NZ SOlp ; RET ; SOlpx1 RES 0,(IX+ObjeFlag) ; CALL TidyMiss ; BIT 3,(IX+ObjeFlag) ; JR Z SOlpxz ; JR SOlpx2 ; LD A,(IX+ObjeOldX) ; SUB (IX+ObjeX+1) ; LD H,A ; LD L,0 ; LD D,(IX+ObjeZ+1) ; LD E,0 ; CALL SignMult ; LD D,(IX+ObjeOldZ) ; LD E,0 ; CALL SignDiv ; LD A,(IX+ObjeX+1) ; SUB H ; BIT 7,A ; JR Z SOlpa ; NEG ; SOlpa CP (IX+ObjeHSize) ; JR NC SOlpxz ; SOlpx1a LD A,(IX+ObjeY+1) ; BIT 7,A ; JR NZ SOlpx2 ; OR A ; JR NZ SOlpxz ; LD A,(IX+ObjeY) ; CP 64 ; ; JR NC SOlpxz SOlpx2 BIT 6,(IX+ObjeFlag) ; JR Z HM1 ; JR SOlpxz ; HM1 CALL HitMan ; JR SOlpxz ; TidyMiss BIT 0,(IX+ObjeMiss) ; RET Z ; LD HL,nMiss ; DEC (HL) ; RET ; OFire CALL gpObje ; RET C ; CALL CreateObje ; LD A,(IX+ObjeX) ; LD (IY+ObjeX),A ; LD A,(IX+ObjeY) ; LD (IY+ObjeY),A ; LD A,(IX+ObjeZ) ; LD (IY+ObjeZ),A ; LD A,(IX+ObjeX+1) ; LD (IY+ObjeX+1),A ; LD A,(IX+ObjeY+1) ; LD (IY+ObjeY+1),A ; LD A,(IX+ObjeZ+1) ; LD (IY+ObjeZ+1),A ; LD (IY+ObjepMove),pMiss&#FF ; LD (IY+ObjepMove+1),pMiss/256 ; LD (IY+ObjepShp),Miss1&#FF ; LD (IY+ObjepShp+1),Miss1/256 ; LD (IY+ObjenShp),1 ; LD (IY+ObjeState),4 ; LD (IY+ObjeFlag),#D ; LD (IY+ObjeCol),#45 ; LD (IY+ObjeMiss),1 ; LD HL,nMiss ; INC (HL) ; LD A,R ; AND #1F ; ADD A,14 ; OFAim EX AF,AF' ;;; LD HL,(DeltaX) ; CALL NegHL ; CALL OFM ; LD E,(IY+ObjeX) ; LD D,(IY+ObjeX+1) ; OR A ; SBC HL,DE ; CALL OFD ; LD (IY+ObjedX),L ; LD (IY+ObjedX+1),H ; LD HL,(DeltaY) ; CALL NegHL ; CALL OFM ; LD E,(IY+ObjeY) ; LD D,(IY+ObjeY+1) ; OR A ; SBC HL,DE ; CALL OFD ; LD (IY+ObjedY),L ; LD (IY+ObjedY+1),H ; LD HL,(DeltaZ) ; CALL NegHL ; CALL OFM ; LD E,(IY+ObjeZ) ; LD D,(IY+ObjeZ+1) ; OR A ; SBC HL,DE ; CALL OFD ; LD (IY+ObjedZ),L ; LD (IY+ObjedZ+1),H ; RET ; OFM LD E,0 ; EX AF,AF' ;;; LD D,A ; EX AF,AF' ;;; CALL SignMult ; RET ; OFD LD E,0 ; EX AF,AF' ;;; LD D,A ; EX AF,AF' ;;; CALL SignDiv ; RET ; pMiss LD A,(IX+ObjeCol) ; INC A ; AND #7 ; JR NZ pM1 ; LD A,4 ; pM1 OR #40 ; LD (IX+ObjeCol),A ; pShape LD L,(IX+ObjeX) ; LD H,(IX+ObjeX+1) ; LD E,(IX+ObjeZ) ; LD D,(IX+ObjeZ+1) ; LD (TempZ),DE ; CALL ObjeDiv ; LD (X1),HL ; LD BC,128 ; ADD HL,BC ; OR A ; BIT 7,H ; RET NZ ; LD A,H ; OR A ; RET NZ ; LD L,(IX+ObjeY) ; LD H,(IX+ObjeY+1) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y1),HL ; LD BC,128 ; ADD HL,BC ; OR A ; BIT 7,H ; RET NZ ; LD A,H ; OR A ; RET NZ ; LD HL,(TempZ) ; SRA H:RR L ; SRA H:RR L ; SRA H:RR L ; LD (TempZ),HL ; SET 0,(IX+ObjeFlag) ; LD L,(IX+ObjepShp) ; LD H,(IX+ObjepShp+1) ; DEC (IX+ObjenShp) ; JR NZ DS0 ; LD A,(HL) ; INC HL ; LD H,(HL) ; INC HL ; LD L,A ; LD (IX+ObjepShp),L ; LD (IX+ObjepShp+1),H ; INC HL:INC HL ; LD A,(HL) ; LD (IX+ObjenShp),A ; DEC HL:DEC HL ; DS0 PUSH IX ; PUSH IX ; PUSH HL ; POP IX ; INC IX:INC IX:INC IX ; LD B,(IX) ; INC IX ; LD IY,X2 ; DSlp1 LD L,(IX) ; LD H,(IX+1) ; LD DE,(TempZ) ; CALL ShapeDiv ; LD DE,(X1) ; ADD HL,DE ; LD (IY),L ; LD (IY+1),H ; LD L,(IX+2) ; LD H,(IX+3) ; LD DE,(TempZ) ; CALL ShapeDiv ; LD DE,(Y1) ; ADD HL,DE ; LD (IY+2),L ; LD (IY+3),H ; LD DE,4 ; ADD IX,DE ; ADD IY,DE ; DJNZ DSlp1 ; POP IY ; LD DE,ObjeOldLines ; ADD IY,DE ; CALL RemoveLines ; LD B,(IX) ; INC IX ; DSlp2 PUSH BC ; LD DE,X2 ; LD L,(IX) ; INC IX ; LD H,0 ; ADD HL,HL ; ADD HL,HL ; ADD HL,DE ; LD C,(HL) ; INC HL ; LD B,(HL) ; INC HL ; LD (DSx1),BC ; LD C,(HL) ; INC HL ; LD B,(HL) ; INC HL ; LD (DSy1),BC ; LD L,(IX) ; INC IX ; LD H,0 ; ADD HL,HL ; ADD HL,HL ; ADD HL,DE ; LD C,(HL) ; INC HL ; LD B,(HL) ; INC HL ; LD (DSx2),BC ; LD C,(HL) ; INC HL ; LD B,(HL) ; INC HL ; LD (DSy2),BC ; DEFB #21 ; DSy1 DEFW 0 ; DEFB #11 ; DSy2 DEFW 0 ; EXX ; DEFB #21 ; DSx1 DEFW 0 ; DEFB #11 ; DSx2 DEFW 0 ; CALL AnyLine ; POP BC ; DJNZ DSlp2 ; POP IX ; SCF ; RET ; pSquTow EQU $ ; LD L,(IX+ObjeX) ; LD H,(IX+ObjeX+1) ; LD (TempX),HL ; LD E,(IX+ObjeZ) ; LD D,(IX+ObjeZ+1) ; LD (TempZ),DE ; LD BC,TWidth ; OR A ; SBC HL,BC ; LD (TempXl),HL ; CALL ObjeDiv ; LD (X1),HL ; LD HL,(TempX) ; LD BC,TWidth ; ADD HL,BC ; LD (TempXr),HL ; CALL ObjeDiv ; LD (X2),HL ; LD DE,(X1) ; OR A ; SBC HL,DE ; OR A ; BIT 7,H ; RET NZ ; ADD HL,DE ; LD BC,128 ; ADD HL,BC ; OR A ; BIT 7,H ; RET NZ ; LD HL,-127 ; ADD HL,DE ; OR A ; BIT 7,H ; RET Z ; ; X windowed LD L,(IX+ObjeY) ; LD H,(IX+ObjeY+1) ; LD (TempY),HL ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y1),HL ; LD HL,(GroundY) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y2),HL ; LD DE,(Y1) ; OR A ; SBC HL,DE ; OR A ; BIT 7,H ; RET NZ ; ADD HL,DE ; LD BC,128 ; ADD HL,BC ; OR A ; BIT 7,H ; RET NZ ; EX DE,HL ; LD BC,-127 ; ADD HL,BC ; OR A ; BIT 7,H ; RET Z ; ; Y windowed SET 0,(IX+ObjeFlag) ; LD HL,(TempZ) ; LD BC,TWidth * 2 ; ADD HL,BC ; LD (TempZ),HL ; EX DE,HL ; LD HL,(TempXl) ; CALL ObjeDiv ; LD (X3),HL ; LD HL,(TempXr) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (X4),HL ; LD HL,(TempY) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y3),HL ; LD HL,(GroundY) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y4),HL ; PUSH IX ; POP IY ; LD BC,ObjeOldLines ; ADD IY,BC ; CALL RemoveLines ; LD HL,(X4) ; LD BC,(X2) ; DEC BC ; DEC HL ; OR A ; SBC HL,BC ; JP P Towerad ; LD HL,(X1) ; LD BC,(X3) ; DEC HL ; OR A ; SBC HL,BC ; JP P Towercf ; Towerbe LD A,(Y1+1) ; BIT 7,A ; JR NZ Towere ; Towerb LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X2) ; CALL VertLine ; LD HL,(X2) ; LD DE,(X1) ; LD BC,(Y1) ; CALL HoriLine ; LD HL,(X4) ; LD DE,(X3) ; LD BC,(Y3) ; CALL HoriLine ; LD HL,(X3) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; CALL AnyLine ; LD HL,(X4) ; LD DE,(X2) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; JP AnyLine ; Towere LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X2) ; CALL VertLine ; LD HL,(X2) ; LD DE,(X1) ; LD BC,(Y1) ; JP HoriLine ; Towerad LD A,(Y1+1) ; BIT 7,A ; JR NZ Towerd ; Towera LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X2) ; CALL VertLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X4) ; CALL VertLine ; LD HL,(X2) ; LD DE,(X1) ; LD BC,(Y1) ; CALL HoriLine ; LD HL,(X4) ; LD DE,(X3) ; LD BC,(Y3) ; CALL HoriLine ; LD HL,(X3) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; CALL AnyLine ; LD HL,(X4) ; LD DE,(X2) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; JP AnyLine ; Towerd LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X2) ; CALL VertLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X4) ; CALL VertLine ; LD HL,(X2) ; LD DE,(X1) ; LD BC,(Y1) ; CALL HoriLine ; LD HL,(X4) ; LD DE,(X2) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; JP AnyLine ; Towercf LD A,(Y1+1) ; BIT 7,A ; JR NZ Towerf ; Towerc LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X2) ; CALL VertLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X3) ; CALL VertLine ; LD HL,(X2) ; LD DE,(X1) ; LD BC,(Y1) ; CALL HoriLine ; LD HL,(X4) ; LD DE,(X3) ; LD BC,(Y3) ; CALL HoriLine ; LD HL,(X3) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; CALL AnyLine ; LD HL,(X4) ; LD DE,(X2) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; JP AnyLine ; Towerf LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X2) ; CALL VertLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X3) ; CALL VertLine ; LD HL,(X2) ; LD DE,(X1) ; LD BC,(Y1) ; CALL HoriLine ; LD HL,(X3) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; JP AnyLine ; pTriTow LD L,(IX+ObjeX) ; LD H,(IX+ObjeX+1) ; LD (TempX),HL ; LD E,(IX+ObjeZ) ; LD D,(IX+ObjeZ+1) ; LD (TempZ),DE ; CALL ObjeDiv ; LD (X1),HL ; LD HL,(TempZ) ; LD DE,TWidth*2 ; ADD HL,DE ; LD (TempZ),HL ; EX DE,HL ; LD HL,(TempX) ; LD BC,-TWidth ; ADD HL,BC ; LD (TempXl),HL ; CALL ObjeDiv ; LD (X2),HL ; LD HL,(TempX) ; LD BC,TWidth ; ADD HL,BC ; LD (TempXr),HL ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (X3),HL ; LD DE,(X2) ; OR A ; SBC HL,DE ; OR A ; BIT 7,H ; RET NZ ; ADD HL,DE ; LD BC,128 ; ADD HL,BC ; OR A ; BIT 7,H ; RET NZ ; LD HL,-127 ; ADD HL,DE ; OR A ; BIT 7,H ; RET Z ; ; X windowed LD E,(IX+ObjeZ) ; LD D,(IX+ObjeZ+1) ; PUSH DE ; LD L,(IX+ObjeY) ; LD H,(IX+ObjeY+1) ; LD (TempY),HL ; CALL ObjeDiv ; LD (Y1),HL ; LD HL,(GroundY) ; POP DE ; CALL ObjeDiv ; LD (Y2),HL ; LD DE,(Y1) ; OR A ; SBC HL,DE ; OR A ; BIT 7,H ; RET NZ ; ADD HL,DE ; LD BC,128 ; ADD HL,BC ; OR A ; BIT 7,H ; RET NZ ; LD HL,-127 ; ADD HL,DE ; OR A ; BIT 7,H ; RET Z ; ; Y windowed SET 0,(IX+ObjeFlag) ; LD HL,(TempY) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y3),HL ; LD HL,(GroundY) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y4),HL ; PUSH IX ; POP IY ; LD BC,ObjeOldLines ; ADD IY,BC ; CALL RemoveLines ; LD HL,(X3) ; LD DE,(X1) ; DEC HL ; OR A ; SBC HL,DE ; BIT 7,H ; JR NZ Tricd ; LD HL,(X2) ; EX DE,HL ; DEC HL ; OR A ; SBC HL,DE ; BIT 7,H ; JP NZ Trief ; LD A,(Y1+1) ; BIT 7,A ; JR NZ Trib ; LD HL,(X3) ; LD DE,(X2) ; LD BC,(Y3) ; CALL HoriLine ; Trib LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X2) ; CALL VertLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X3) ; CALL VertLine ; LD HL,(X2) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; CALL AnyLine ; LD HL,(X3) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; JP AnyLine ; Tricd LD A,(Y1+1) ; BIT 7,A ; JR NZ Trid ; LD HL,(X3) ; LD DE,(X2) ; LD BC,(Y3) ; CALL HoriLine ; LD HL,(X3) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; CALL AnyLine ; Trid LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X2) ; CALL VertLine ; LD HL,(X2) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; JP AnyLine ; Trief LD A,(Y1+1) ; BIT 7,A ; JR NZ Trif ; LD HL,(X3) ; LD DE,(X2) ; LD BC,(Y3) ; CALL HoriLine ; LD HL,(X2) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; CALL AnyLine ; Trif LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X3) ; CALL VertLine ; LD HL,(X3) ; LD DE,(X1) ; EXX ; LD HL,(Y3) ; LD DE,(Y1) ; EXX ; JP AnyLine ; pGunTow LD L,(IX+ObjeX) ; LD H,(IX+ObjeX+1) ; LD (TempX),HL ; LD E,(IX+ObjeZ) ; LD D,(IX+ObjeZ+1) ; LD (TempZ),DE ; CALL ObjeDiv ; LD (X1),HL ; LD HL,(TempZ) ; LD DE,TWidth ; ADD HL,DE ; LD (TempZ),HL ; EX DE,HL ; LD HL,(TempX) ; LD BC,-GWidth ; ADD HL,BC ; CALL ObjeDiv ; LD (X2),HL ; LD HL,(TempX) ; LD BC,GWidth ; ADD HL,BC ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (X3),HL ; LD DE,(X2) ; OR A ; SBC HL,DE ; OR A ; BIT 7,H ; RET NZ ; ADD HL,DE ; LD BC,128 ; ADD HL,BC ; OR A ; BIT 7,H ; RET NZ ; LD HL,-127 ; ADD HL,DE ; OR A ; BIT 7,H ; RET Z ; ; X windowed LD L,(IX+ObjeY) ; LD H,(IX+ObjeY+1) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y3),HL ; LD HL,(GroundY) ; LD E,(IX+ObjeZ) ; LD D,(IX+ObjeZ+1) ; CALL ObjeDiv ; LD (Y2),HL ; LD DE,(Y3) ; OR A ; SBC HL,DE ; OR A ; BIT 7,H ; RET NZ ; ; Y windowed SET 0,(IX+ObjeFlag) ; LD HL,(GroundY) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y4),HL ; PUSH IX ; POP IY ; LD BC,ObjeOldLines ; ADD IY,BC ; CALL RemoveLines ; LD HL,(X3) ; LD DE,(X2) ; LD BC,(Y3) ; CALL HoriLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X2) ; CALL VertLine ; LD HL,(Y4) ; LD DE,(Y3) ; LD BC,(X3) ; JP VertLine ; pTMATow LD L,(IX+ObjeX) ; LD H,(IX+ObjeX+1) ; LD (TempX),HL ; LD DE,-TMAWidth ; ADD HL,DE ; LD E,(IX+ObjeZ) ; LD D,(IX+ObjeZ+1) ; LD (TempZ),DE ; CALL ObjeDiv ; LD (X1),HL ; LD HL,(TempX) ; LD DE,TMAWidth ; ADD HL,DE ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (X2),HL ; LD DE,(X1) ; OR A ; SBC HL,DE ; OR A ; BIT 7,H ; RET NZ ; ADD HL,DE ; LD BC,128 ; ADD HL,BC ; OR A ; BIT 7,H ; RET NZ ; LD HL,-127 ; ADD HL,DE ; OR A ; BIT 7,H ; RET Z ; ; X windowed LD L,(IX+ObjeY) ; LD H,(IX+ObjeY+1) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y1),HL ; LD HL,(GroundY) ; LD DE,(TempZ) ; CALL ObjeDiv ; LD (Y2),HL ; LD DE,(Y1) ; OR A ; SBC HL,DE ; OR A ; BIT 7,H ; RET NZ ; ADD HL,DE ; LD BC,128 ; ADD HL,BC ; OR A ; BIT 7,H ; RET NZ ; EX DE,HL ; LD BC,-127 ; ADD HL,BC ; OR A ; BIT 7,H ; RET Z ; ; Y windowed SET 0,(IX+ObjeFlag) ; PUSH IX ; POP IY ; LD BC,ObjeOldLines ; ADD IY,BC ; CALL RemoveLines ; LD HL,(X2) ; LD DE,(X1) ; LD BC,(Y1) ; CALL HoriLine ; LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X2) ; CALL VertLine ; LD HL,(Y2) ; LD DE,(Y1) ; LD BC,(X1) ; CALL VertLine ; LD HL,(X2) ; LD DE,(X1) ; LD BC,(Y2) ; JP HoriLine ; RemoveLines PUSH IY ; RLlp LD L,(IY) ; LD H,(IY+1) ; CALL CallHL ; LD BC,lObjeLine ; ADD IY,BC ; JP RLlp ; nLine POP AF ; POP IY ; RET ; VS1 POP HL ; SCF ; RET ; VertLine PUSH HL ; LD L,C ; LD H,B ; LD BC,128 ; ADD HL,BC ; BIT 7,H ; JR NZ VS1 ; INC H ; DEC H ; JR NZ VS1 ; LD A,L ; RRCA ; RRCA ; RRCA ; AND #1F ; LD (V1),A ; LD A,L ; RLCA ; RLCA ; RLCA ; CPL ; AND #38 ; OR #C6 ; LD (Vert4+1),A ; AND #BF ; LD (IY+AnyBit),A ; POP HL ; LD BC,128 ; ADD HL,BC ; EX DE,HL ; ADD HL,BC ; LD A,H ; OR A ; JR Z VS2 ; LD L,0 ; JP M VS2 ; LD L,#FF ; VS2 LD H,DivTab/256 ; LD A,D ; OR A ; JR Z VS3 ; LD E,0 ; JP M VS3 ; LD E,#FF ; VS3 LD D,DivTab/256 ; LD A,(DE) ; SUB (HL) ; SCF ; RET Z ; INC A ; LD (IY+AnyB),A ; LD B,A ; LD L,(HL) ; LD H,YTable/256 ; LD A,(V1) ; LD C,A ; ADD A,(HL) ; LD (IY+AnyL),A ; INC H ; LD A,(HL) ; LD (IY+AnyH),A ; LD A,L ; RLCA ; RLCA ; AND #3 ; OR #58 ; LD (IY+AnyH1),A ; LD D,A ; LD A,L ; RLCA ; RLCA ; AND #E0 ; OR C ; LD (IY+AnyL1),A ; LD E,A ; LD A,L ; AND #07 ; LD L,A ; LD H,BitTab/256 ; LD A,(HL) ; LD (IY+AnyA),A ; EX DE,HL ; LD C,(IX+ObjeCol) ; LD DE,#20 ; EXX ; LD C,#20 ; LD B,(IY+AnyB) ; LD L,(IY+AnyL) ; LD H,(IY+AnyH) ; CALL Vert2 ; BIT 7,A ; JR NZ VS4 ; EXX ; LD (HL),C ; EXX ; VS4 LD (IY+0),Vert10&#FF ; LD (IY+1),Vert10/256 ; LD BC,lObjeLine ; ADD IY,BC ; SCF ; RET ; V1 DEFB 0 ; Vert1 EXX ; LD (HL),C ; ADD HL,DE ; EXX ; Vert3 LD A,#80 ; Vert2 DEC B ; RET Z ; Vert4 SET 0,(HL) ; SMC INC H ; RRCA ; JP NC Vert2 ; LD A,L ; ADD A,C ; LD L,A ; JR C Vert1 ; LD A,H ; SUB 8 ; LD H,A ; JP Vert1 ; Vert10 LD L,(IY+AnyL1) ; LD H,(IY+AnyH1) ; LD DE,#20 ; LD A,(GameAttr) ; LD C,A ; EXX ; LD A,(IY+AnyBit) ; LD (Vert4+1),A ; LD A,(IY+AnyA) ; LD B,(IY+AnyB) ; LD L,(IY+AnyL) ; LD H,(IY+AnyH) ; LD C,#20 ; CALL Vert2 ; BIT 7,A ; RET NZ ; EXX ; LD (HL),C ; EXX ; RET ; HS1 POP HL ; SCF ; RET ; HpS DEFW 0 ; HpA DEFW 0 ; HoriLine PUSH HL ; LD L,C ; LD H,B ; LD BC,128 ; ADD HL,BC ; INC H ; DEC H ; JR NZ HS1 ; LD H,DivTab/256 ; LD L,(HL) ; LD H,YTable/256 ; LD C,(HL) ; INC H ; LD B,(HL) ; LD (HpS),BC ; LD (IY+AnyH),B ; LD A,L ; RLCA ; RLCA ; AND #3 ; OR #58 ; LD H,A ; LD A,L ; RLCA ; RLCA ; AND #E0 ; LD L,A ; LD (HpA),HL ; LD (IY+AnyD),H ; POP HL ; LD BC,128 ; ADD HL,BC ; LD A,H ; OR A ; JR Z HS2 ; LD L,0 ; JP M HS2 ; LD L,#FF ; HS2 EX DE,HL ; ADD HL,BC ; LD A,H ; OR A ; JR Z HS3 ; LD L,0 ; JP M HS3 ; LD L,#FF ; HS3 LD A,L ; SUB E ; SCF ; RET Z ; LD A,L ; AND #7 ; ADD A,8 ; LD C,A ; LD B,BitTab/256 ; LD A,(BC) ; LD (IY+AnyA),A ; LD A,E ; AND #7 ; ADD A,16 ; LD C,A ; LD A,(BC) ; LD (IY+AnyA1),A ; LD A,L ; RRCA ; RRCA ; RRCA ; AND #1F ; LD L,A ; LD A,E ; RRCA ; RRCA ; RRCA ; AND #1F ; LD E,A ; LD A,(HpS) ; OR L ; LD (HpS),A ; LD (IY+AnyL),A ; LD A,(HpA) ; OR L ; LD (HpA),A ; LD (IY+AnyE),A ; LD A,E ; SUB L ; JR Z HS4 ; LD (IY+AnyB),A ; LD HL,(HpS) ; LD DE,(HpA) ; LD B,A ; LD C,(IX+ObjeCol) ; LD A,(IY+AnyA1) ; EX AF,AF' ;;; LD A,(IY+AnyA) ; CALL HoriS ; LD (IY+0),HS6&#FF ; LD (IY+1),HS6/256 ; LD BC,lObjeLine ; ADD IY,BC ; SCF ; RET ; HS4 LD HL,(HpA) ; LD C,(IX+ObjeCol) ; LD (HL),C ; LD HL,(HpS) ; LD A,(IY+AnyA) ; AND (IY+AnyA1) ; OR (HL) ; LD (HL),A ; LD (IY+0),HS5&#FF ; LD (IY+1),HS5/256 ; LD BC,lObjeLine ; ADD IY,BC ; SCF ; RET ; HS5 LD L,(IY+AnyE) ; LD H,(IY+AnyD) ; LD A,(GameAttr) ; LD (HL),A ; LD L,(IY+AnyL) ; LD H,(IY+AnyH) ; LD A,(IY+AnyA) ; AND (IY+AnyA1) ; CPL ; AND (HL) ; LD (HL),A ; RET ; HS6 LD L,(IY+AnyL) ; LD H,(IY+AnyH) ; LD E,(IY+AnyE) ; LD D,(IY+AnyD) ; LD B,(IY+AnyB) ; LD A,(IY+AnyA1) ; CPL ; EX AF,AF' ;;; LD A,(GameAttr) ; LD C,A ; LD A,(IY+AnyA) ; CPL ; AND (HL) ; LD (HL),A ; LD A,C ; LD (DE),A ; INC L ; INC E ; DJNZ Hori0a ; LD (DE),A ; EX AF,AF' ;;; AND (HL) ; LD (HL),A ; RET ; Hori0a LD C,#00 ; Hori1a LD (HL),C ; LD (DE),A ; INC L ; INC E ; DJNZ Hori1a ; LD (DE),A ; EX AF,AF' ;;; AND (HL) ; LD (HL),A ; RET ; HoriS OR (HL) ; LD (HL),A ; LD A,C ; LD (DE),A ; INC L ; INC E ; DJNZ Hori0 ; LD (DE),A ; EX AF,AF' ;;; OR (HL) ; LD (HL),A ; RET ; Hori0 LD C,#FF ; Hori1 LD (HL),C ; LD (DE),A ; INC L ; INC E ; DJNZ Hori1 ; LD (DE),A ; EX AF,AF' ;;; OR (HL) ; LD (HL),A ; RET ; CalcEdges XOR A ; INC H ; DEC H ; JR Z CalcC1b ; BIT 7,H ; JR NZ CalcC1a ; OR #02 ; JP CalcC1b ; CalcC1a OR #01 ; CalcC1b INC D ; DEC D ; RET Z ; BIT 7,D ; JR NZ CalcC1c ; OR #04 ; RET ; CalcC1c OR #08 ; RET ; ClipThing LD BC,128 ; ADD HL,BC ; LD (ctX2),HL ; EX DE,HL ; ADD HL,BC ; LD (ctX1),HL ; EXX ; LD BC,128 ; ADD HL,BC ; LD (ctY2),HL ; EX DE,HL ; ADD HL,BC ; LD (ctY1),HL ; LD HL,(ctX1) ; LD DE,(ctY1) ; CALL CalcEdges ; LD B,A ; LD HL,(ctX2) ; LD DE,(ctY2) ; CALL CalcEdges ; LD C,A ; OR B ; RET Z ; LD A,C ; AND B ; SCF ; RET NZ ; LD HL,(ctX1) ; LD (PaX),HL ; LD HL,(ctY1) ; LD (PaY),HL ; LD HL,(ctX2) ; LD (PbX),HL ; LD HL,(ctY2) ; LD (PbY),HL ; CALL ClipInner ; RET C ; LD HL,(PaX) ; LD (ctX2),HL ; LD HL,(PaY) ; LD (ctY2),HL ; LD HL,(ctX2) ; LD (PaX),HL ; LD HL,(ctY2) ; LD (PaY),HL ; LD HL,(ctX1) ; LD (PbX),HL ; LD HL,(ctY1) ; LD (PbY),HL ; CALL ClipInner ; RET C ; LD HL,(PaX) ; LD (ctX1),HL ; LD HL,(PaY) ; LD (ctY1),HL ; OR A ; RET ; ClipInner LD HL,(PbX) ; LD DE,(PbY) ; LD (PmX),HL ; LD (PmY),DE ; CALL CalcEdges ; OR A ; JR NZ C2 ; LD (PaX),HL ; LD (PaY),DE ; RET ; C2 LD HL,(PaX) ; LD DE,(PaY) ; CALL CalcEdges ; LD B,A ; LD HL,(PmX) ; LD DE,(PmY) ; CALL CalcEdges ; AND B ; SCF ; RET NZ ; LD HL,(PmX) ; LD DE,(PaX) ; OR A ; SBC HL,DE ; SRA H ; RR L ; LD DE,(PaX) ; ADD HL,DE ; LD (PmX),HL ; LD HL,(PmY) ; LD DE,(PaY) ; OR A ; SBC HL,DE ; SRA H ; RR L ; LD DE,(PaY) ; ADD HL,DE ; LD (PmY),HL ; CALL TestPm ; RET Z ; LD HL,(PbX) ; LD DE,(PbY) ; CALL CalcEdges ; LD B,A ; LD HL,(PmX) ; LD DE,(PmY) ; CALL CalcEdges ; AND B ; JR Z C4a ; LD (PbX),HL ; LD (PbY),DE ; JP C2 ; C4a LD (PaX),HL ; LD (PaY),DE ; LD HL,(PbX) ; LD DE,(PbY) ; LD (PmX),HL ; LD (PmY),DE ; JP C2 ; TestPm LD HL,(PmX) ; LD DE,(PaX) ; OR A ; SBC HL,DE ; JR NZ TPm1 ; LD HL,(PmY) ; LD DE,(PaY) ; OR A ; SBC HL,DE ; RET Z ; TPm1 LD HL,(PmX) ; LD DE,(PbX) ; OR A ; SBC HL,DE ; RET NZ ; LD HL,(PmY) ; LD DE,(PbY) ; OR A ; SBC HL,DE ; RET ; ALOld PUSH IX ; LD A,(IY+AnySxx) ; LD (OAxx),A ; LD A,(IY+AnySyy) ; LD (OAyy),A ; LD A,(IY+AnyHV) ; LD (OAHV),A ; LD L,(IY+AnyIXl) ; LD H,(IY+AnyIXh) ; PUSH HL ; POP IX ; LD B,(IY+AnyB1) ; LD C,(IY+AnyC1) ; LD E,(IY+AnyE1) ; LD D,(IY+AnyD1) ; LD L,(IY+AnyL1) ; LD H,(IY+AnyH1) ; EXX ; LD B,(IY+AnyB) ; LD C,(IY+AnyC) ; LD E,(IY+AnyE) ; LD L,(IY+AnyL) ; LD H,(IY+AnyH) ; LD A,(GameAttr) ; LD D,A ; LD A,(HL) ; OA1 CPL ; OR C ; CPL ; EXX ; SBC HL,DE ; JR C OA3 ; EXX ; DEFB #CD ; OAHV DEFW Incxx ; DJNZ OA1 ; LD (HL),A ; OA3x LD A,C ; AND E ; JP M OA3a ; LD (IX),D ; OA3a POP IX ; RET ; OA3 ADD HL,BC ; EXX ; DEFB #CD ; OAxx DEFW Incxx ; DEFB #CD ; OAyy DEFW Incxx ; LD (HL),A ; DJNZ OA1 ; JP OA3x ; AnyLine CALL ClipThing ; RET C ; LD A,(ctX1) ; LD E,A ; SRL E ; SRL E ; SRL E ; AND #7 ; LD L,A ; LD H,BitTab/256 ; LD C,(HL) ; LD H,DivTab/256 ; LD A,(ctY1) ; LD L,A ; LD A,(HL) ; LD (ctY1),A ; LD D,A ; RLCA ; RLCA ; AND #03 ; OR #58 ; LD (IX_h),A ; LD (IY+AnyIXh),A ; LD A,D ; RLCA ; RLCA ; AND #E0 ; OR E ; LD (IX_l),A ; LD (IY+AnyIXl),A ; LD A,(ctY2) ; LD L,A ; LD A,(HL) ; LD (ctY2),A ; LD A,D ; AND #7 ; LD L,A ; LD H,BitTab/256 ; LD B,(HL) ; EXX ; PUSH IX ; PUSH IY ; LD IY,Incyy ; LD IX,Incxx ; LD DE,(ctY1) ; LD HL,(ctY2) ; OR A ; SBC HL,DE ; JP P LineA ; LD A,L ; CPL ; LD L,A ; LD A,H ; CPL ; LD H,A ; INC HL ; LD IY,Decyy ; LineA LD C,L ; LD B,H ; LD DE,(ctX1) ; LD HL,(ctX2) ; OR A ; SBC HL,DE ; JP P LineB ; LD A,L ; CPL ; LD L,A ; LD A,H ; CPL ; LD H,A ; INC HL ; LD IX,Decxx ; LineB LD (sxxVector),IX ; LD (syyVector),IY ; OR A ; SBC HL,BC ; ADD HL,BC ; JP M LineC ; LD (HorizVector),IX ; LD E,C:LD D,B ; LD C,L:LD B,H ; JP LineD ; LineC LD (HorizVector),IY ; LD E,L:LD D,H ; LD L,C:LD H,B ; LineD SRA H ; RR L ; LD A,C ; EXX ; POP IY ; POP IX ; SCF ; RET Z ; EX AF,AF' ;;; LD H,YTable/256 ; LD L,D ; LD A,(HL) ; ADD A,E ; INC H ; LD H,(HL) ; LD L,A ; EX AF,AF' ;;; LD E,B ; LD B,A ; LD (IY+0),ALOld&#FF ; LD (IY+1),ALOld/256 ; LD (IY+AnyL),L ; LD (IY+AnyH),H ; LD (IY+AnyE),E ; LD (IY+AnyC),C ; LD (IY+AnyB),B ; EXX ; LD (IY+AnyL1),L ; LD (IY+AnyH1),H ; LD (IY+AnyE1),E ; LD (IY+AnyD1),D ; LD (IY+AnyC1),C ; LD (IY+AnyB1),B ; EXX ; LD A,(Colour) ; LD D,A ; PUSH IX ; DEFB #DD,#21 ; IX_l DEFB 0 ; IX_h DEFB 0 ; LD A,(HL) ; LineAlg OR C ; EXX ; SBC HL,DE ; JR C LineAlg1 ; EXX ; DEFB #CD ; HorizVector DEFW vRet ; DJNZ LineAlg ; JP LineX ; LineAlg1 ADD HL,BC ; EXX ; DEFB #CD ; sxxVector DEFW vRet ; DEFB #CD ; syyVector DEFW vRet ; DJNZ LineAlg ; LineX LD (HL),A ; LD A,E ; AND C ; JP M LineXa ; LD (IX),D ; LineXa POP IX ; LD A,(sxxVector) ; LD (IY+AnySxx),A ; LD A,(syyVector) ; LD (IY+AnySyy),A ; LD A,(HorizVector) ; LD (IY+AnyHV),A ; LD BC,lObjeLine ; ADD IY,BC ; SCF ; RET ; ALIGN $100 ; Incxx RRC C ; RET NC ; LD (HL),A ; LD (IX),D ; INC IXL ; INC L ; LD A,(HL) ; RET ; Decxx RLC C ; RET NC ; LD (HL),A ; LD (IX),D ; DEC IXL ; DEC L ; LD A,(HL) ; RET ; Incyy LD (HL),A ; INC H ; RRC E ; LD A,(HL) ; RET NC ; LD (IX),D ; PUSH BC ; LD BC,#20 ; ADD IX,BC ; POP BC ; LD A,L ; ADD A,#20 ; LD L,A ; LD A,(HL) ; RET C ; LD A,H ; SUB 8 ; LD H,A ; LD A,(HL) ; RET ; Decyy LD (HL),A ; DEC H ; RLC E ; LD A,(HL) ; RET NC ; LD (IX),D ; PUSH BC ; LD BC,-#20 ; ADD IX,BC ; POP BC ; LD A,L ; SUB #20 ; LD L,A ; LD A,(HL) ; RET C ; LD A,H ; ADD A,8 ; LD H,A ; LD A,(HL) ; RET ; AlterSteps CALL kDeccel ; JR NZ AS0 ; CALL kAccel ; JR Z AS2 ; LD DE,Zdvstep ; JR AS1 ; AS0 LD DE,-Zdvstep ; AS1 LD HL,(DeltaZ) ; ADD HL,DE ; LD DE,MinSp ; ADD HL,DE ; BIT 7,H ; JR Z AS2 ; OR A ; SBC HL,DE ; LD DE,MaxSp ; ADD HL,DE ; BIT 7,H ; JR NZ AS2 ; OR A ; SBC HL,DE ; LD (DeltaZ),HL ; AS2 CALL kLeft ; LD A,1 ; JR NZ AS21 ; CALL kRight ; LD A,2 ; JP Z AS3x ; AS21 LD B,A ; LD A,(OldX) ; CP B ; JR Z AS2a ; LD HL,Xdtstep ; LD (Xvar),HL ; AS2a LD HL,(Xvar) ; LD DE,dDX ; ADD HL,DE ; LD (Xvar),HL ; EX DE,HL ; LD HL,(XTurnRatio) ; LD A,B ; LD (OldX),A ; BIT 0,A ; CALL ASMakeTurn ; LD (XTurnRatio),HL ; AS3 CALL kUp ; LD A,1 ; JR NZ AS31 ; CALL kDown ; LD A,2 ; JR Z AS4 ; AS31 LD B,A ; LD A,(OldY) ; CP B ; JR Z AS3a ; LD HL,Ydtstep ; LD (Yvar),HL ; AS3a LD HL,(Yvar) ; LD DE,dDY ; ADD HL,DE ; LD (Yvar),HL ; LD A,B ; LD (OldY),A ; BIT 0,A ; EX DE,HL ; LD HL,(YDiveRatio) ; CALL ASMakeTurn ; LD (YDiveRatio),HL ; AS4 LD A,(YDiveRatio+1) ; BIT 7,A ; JR Z AS4a ; LD HL,HighY ; CALL Inner ; JR NZ AS5 ; JR AS4c ; AS4a LD HL,LowY ; CALL Inner ; JR Z AS5 ; AS4c LD (YDiveRatio),HL ; AS5 LD HL,(DeltaZ) ; LD DE,(YDiveRatio) ; ADD HL,HL:ADD HL,HL ; ADD HL,HL:ADD HL,HL ; CALL SignMult ; SRA H:RR L ; SRA H:RR L ; SRA H:RR L ; SRA H:RR L ; LD (DeltaY),HL ; CALL NegHL ; ADD HL,HL ; LD (FireDY),HL ; LD DE,(XTurnRatio) ; LD HL,(DeltaZ) ; ADD HL,HL:ADD HL,HL ; ADD HL,HL:ADD HL,HL ; CALL SignMult ; SRA H:RR L ; SRA H:RR L ; SRA H:RR L ; SRA H:RR L ; LD (DeltaX),HL ; CALL NegHL ; ADD HL,HL ; LD (FireDX),HL ; LD HL,(DeltaZ) ; CALL NegHL ; ADD HL,HL ; LD (FireDZ),HL ; LD DE,ProjSp ; OR A ; SBC HL,DE ; BIT 7,H ; RET Z ; LD (FireDZ),DE ; LD HL,ProjSp ; LD DE,(YDiveRatio) ; ADD HL,HL:ADD HL,HL ; ADD HL,HL:ADD HL,HL ; CALL SignMult ; SRA H:RR L ; SRA H:RR L ; SRA H:RR L ; SRA H:RR L ; LD (FireDY),HL ; LD HL,ProjSp ; LD DE,(XTurnRatio) ; ADD HL,HL:ADD HL,HL ; ADD HL,HL:ADD HL,HL ; CALL SignMult ; SRA H:RR L ; SRA H:RR L ; SRA H:RR L ; SRA H:RR L ; LD (FireDX),HL ; RET ; AS3x LD DE,Xdtstep ; LD (Xvar),DE ; JP AS3 ; Inner LD DE,(GroundY) ; OR A ; SBC HL,DE ; SRA H ; RR L ; SRA H ; RR L ; LD DE,(DeltaZ) ; EX DE,HL ; ADD HL,HL:ADD HL,HL ; ADD HL,HL:ADD HL,HL ; EX DE,HL ; CALL SignDiv ; ADD HL,HL:ADD HL,HL ; ADD HL,HL:ADD HL,HL ; LD DE,(YDiveRatio) ; OR A ; SBC HL,DE ; BIT 7,H ; ADD HL,DE ; RET ; Xvar DEFW 3 ; OldX DEFB 0 ; AS4y LD DE,Ydtstep ; LD (Yvar),DE ; JP AS4 ; Yvar DEFW 1 ; OldY DEFB 0 ; ASMakeTurn JR Z ASMT1 ; LD A,D ; CPL ; LD D,A ; LD A,E ; CPL ; LD E,A ; INC DE ; ASMT1 ADD HL,DE ; BIT 7,H ; JR NZ ASMT2 ; DEC H ; INC H ; RET Z ; LD HL,#00FF ; RET ; ASMT2 INC H ; JR NZ ASMT2a ; DEC H ; RET ; ASMT2a LD HL,#FF00 ; RET ; ObjeTemp DEFW 0 ; DEFW -500 ; DEFW 0 ; DEFW GrowthRate ; DEFB 0 ; DEFB 15 ; DEFW pTriTow ; DEFB #F ; F DEFB 2,#FF,#FF ; DEFB #FF,#FF,#FF ; DEFW 0,0,0 ; DEFB #45 ; DEFB 0 ; DEFW nLine,0,0,0 ; Miss1 DEFW Miss2 ; DEFB 2 ; DEFB 4 ; DEFW #28,#00 ; DEFW 0,-#28 ; DEFW -#28,0 ; DEFW 0,#28 ; DEFB 2 ; DEFB 0,2 ; DEFB 1,3 ; Miss2 DEFW Miss1 ; DEFB 2 ; DEFB 4 ; DEFW #20,#20 ; DEFW #20,-#20 ; DEFW -#20,-#20 ; DEFW -#20,#20 ; DEFB 2 ; DEFB 0,2 ; DEFB 1,3 ; ; ; SheetI DEFW Sheett,0 ; ; DEFW X23 ; DEFB sTri ; DEFB 0 ; ; ; Sheett DEFW Sheet0,OneSht ; ; DEFW X23 ; DEFB sShape ; DEFW Miss1 ; DEFB 6 ; DEFB 1 ; ; DEFW X14 ; DEFB sSqu ; DEFB 1 ; ; DEFW X44 ; DEFB sTri ; DEFB 0 ; ; ; Sheet0 DEFW Sheet1,OneSht ; ; DEFW X13 ; DEFB sGun ; DEFB 1 ; ; DEFW X23 ; DEFB sSqu ; DEFB 1 ; ; DEFW X33 ; DEFB sGun ; DEFB 0 ; ; ; Sheet1 DEFW Sheet2,OneSht ; ; DEFW X14 ; DEFB sTri ; DEFB 1 ; ; DEFW X24 ; DEFB sTMA ; DEFB 1 ; ; DEFW X34 ; DEFB sTMA ; DEFB 1 ; ; DEFW X44 ; DEFB sTri ; DEFB 0 ; ; ; Sheet2 DEFW Sheet3,TQrdSht ; ; DEFW X25 ; DEFB sTMA ; DEFB 1 ; ; DEFW X35 ; DEFB sSqu ; DEFB 1 ; ; DEFW X45 ; DEFB sTMA ; DEFB 0 ; ; ; Sheet3 DEFW Sheet4,OneSht ; ; DEFW X24 ; DEFB sTri ; DEFB 1 ; ; DEFW X34 ; DEFB sTri ; DEFB 0 ; ; ; Sheet4 DEFW Sheet5,OneSht ; ; DEFW X24 ; DEFB sTri ; DEFB 1 ; ; DEFW X34 ; DEFB sTri ; DEFB 0 ; ; ; Sheet5 DEFW Sheet6,OneSht ; ; DEFW X13 ; DEFB sTri ; DEFB 1 ; ; DEFW X23 ; DEFB sSqu ; DEFB 1 ; ; DEFW X33 ; DEFB sTri ; DEFB 0 ; ; ; Sheet6 DEFW Sheet7,OneSht ; ; DEFW X15 ; DEFB sTMA ; DEFB 0 ; ; ; Sheet7 DEFW Sheet8,OneSht ; ; DEFW X55 ; DEFB sTMA ; DEFB 0 ; ; ; Sheet8 DEFW Sheett,OneSht ; ; DEFW X35 ; DEFB sTMA ; DEFB 0 ; ; ; ; Vars Var_Start equ . ; SighDE DEFW 0 ; SighIX DEFW 0 ; ALIGN $100 ; DivTab DEFS #100 ; YTable DEFS #200 ; BitTab DEFS 24 ; DeltaX DEFW 0 ; FireDX DEFW 0 ; DeltaY DEFW 0 ; FireDY DEFW 0 ; DeltaZ DEFW 0 ; FireDZ DEFW 0 ; XTurnRatio DEFW 0 ; YDiveRatio DEFW 0 ; nShields DEFB 0 ; SheetZ DEFW 0 ; pSheet DEFW 0 ; FireDel DEFW 0 ; SideSel DEFB 0 ; TopSel DEFB 0 ; TempX DEFW 0 ; TempXl DEFW 0 ; TempXr DEFW 0 ; TempY DEFW 0 ; TempZ DEFW 0 ; X1 DEFW 0 ; Y1 DEFW 0 ; X2 DEFW 0 ; Y2 DEFW 0 ; X3 DEFW 0 ; Y3 DEFW 0 ; X4 DEFW 0 ; Y4 DEFW 0,0,0 ; ctX1 DEFW 0 ; ctX2 DEFW 0 ; ctY1 DEFW 0 ; ctY2 DEFW 0 ; PaX DEFW 0 ; PaY DEFW 0 ; PbX DEFW 0 ; PbY DEFW 0 ; PmX DEFW 0 ; PmY DEFW 0 ; P1X DEFW 0 ; P1Y DEFW 0 ; P2X DEFW 0 ; P2Y DEFW 0 ; Colour DEFB 0 ; nMiss DEFB 0 ; ; align 256 ; IntPage equ $ ; defs $101,((IntPage/256)+1) ; org IntPage+$100 + (IntPage/256)+1 ; IntVec jp IntRoutine ; ALIGN $100 ; ObjeTable DEFS nObje * lObje ; GroundY DEFW StartY ; moved StarTable DEFS nStar * lStar ; ProjTable DEFS nProj * lProj ; ; Tell the emulator mem_smc $0000,$4000 ; ROM is read-only mem_var $4000,$1B00 ; The Spectrum screen is variable mem_smc $5B00, $10000 - $5B00 ; This block is writable